/ Hex Artifact Content
Login

Artifact 071572677469d54899ef0d9fc3ad380a849b860375df5af5ebdc4f49f1dc20cc:


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 28 70  xprSkipCollate(p
22c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
22d0: 67 68 74 29 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ght))->op==TK_CO
22e0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 29  LUMN.          )
22f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2300: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
2310: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61   for(j=0; j<pSca
2320: 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 2b 29 7b  n->nEquiv; j++){
2330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2340: 66 28 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  f( pScan->aiCur[
2350: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2370: 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e   pScan->aiColumn
2380: 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  [j]==pX->iColumn
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23d0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
23e0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
2400: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 20 3d 20 70  an->aiCur[j] = p
2410: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
2420: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2430: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58  aiColumn[j] = pX
2440: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2450: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2460: 6e 45 71 75 69 76 2b 2b 3b 0a 20 20 20 20 20 20  nEquiv++;.      
2470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2480: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2490: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
24a0: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
24b0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
24c0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
24d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
24e0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
24f0: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
2500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2510: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
2520: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
2530: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
2540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2550: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2560: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2570: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
2580: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
2590: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
25a0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
25b0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
25c0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
25d0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
25e0: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
25f0: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
2600: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2610: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2630: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
2640: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2650: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2660: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2670: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20  llSeq(pParse,.  
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
26c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
26d0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
26e0: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  =0 ) pColl = pPa
26f0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2700: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2720: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2730: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
2740: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
2750: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2770: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2780: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2790: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27a0: 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
27b0: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
27c0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
27d0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
27e0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2800: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
2810: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 0a 20 20 20  an->aiCur[0].   
2820: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
2830: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
2840: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20  >aiColumn[0].   
2850: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2860: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2870: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
2880: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28c0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
28d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC;.            
28e0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a  pScan->k = k+1;.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2900: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
2930: 43 20 3d 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b  C = pWC->pOuter;
2940: 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  .      k = 0;.  
2950: 20 20 7d 77 68 69 6c 65 28 20 70 57 43 21 3d 30    }while( pWC!=0
2960: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 61   );.    if( pSca
2970: 6e 2d 3e 69 45 71 75 69 76 3e 3d 70 53 63 61 6e  n->iEquiv>=pScan
2980: 2d 3e 6e 45 71 75 69 76 20 29 20 62 72 65 61 6b  ->nEquiv ) break
2990: 3b 0a 20 20 20 20 70 57 43 20 3d 20 70 53 63 61  ;.    pWC = pSca
29a0: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
29b0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
29c0: 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20 7d 0a  ->iEquiv++;.  }.
29d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29e0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
29f0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
2a00: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
2a10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2a20: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
2a30: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
2a40: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
2a50: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
2a60: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
2a70: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
2a80: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
2a90: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
2aa0: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
2ab0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
2ac0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
2ad0: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
2ae0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
2af0: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 20 4f 72 20  e.** iCur.   Or 
2b00: 69 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20  if pIdx!=0 then 
2b10: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
2b20: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
2b30: 78 2e 20 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74  x.  pIdx.** must
2b40: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
2b50: 6e 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20  ndexes of table 
2b60: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2b70: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
2b80: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
2b90: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
2ba0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
2bb0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
2bc0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
2bd0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
2be0: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
2bf0: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
2c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2c10: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
2c20: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2c30: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
2c40: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
2c50: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
2c60: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
2c70: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
2c80: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
2c90: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
2ca0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
2cb0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
2cc0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
2cd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2ce0: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
2cf0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2d00: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
2d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
2d20: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
2d30: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
2d40: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
2d50: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
2d60: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
2d70: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
2d80: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2da0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2db0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
2dc0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2dd0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2de0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2df0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e10: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
2e20: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e40: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
2e50: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
2e60: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2e70: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2e80: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2e90: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
2ea0: 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43    pScan->pOrigWC
2eb0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2ec0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  >pWC = pWC;.  pS
2ed0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20  can->pIdxExpr = 
2ee0: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  0;.  pScan->idxa
2ef0: 66 66 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d  ff = 0;.  pScan-
2f00: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a  >zCollName = 0;.
2f10: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2f20: 20 20 69 6e 74 20 6a 20 3d 20 69 43 6f 6c 75 6d    int j = iColum
2f30: 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  n;.    iColumn =
2f40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2f50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  j];.    if( iCol
2f60: 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  umn==XN_EXPR ){.
2f70: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64        pScan->pId
2f80: 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43  xExpr = pIdx->aC
2f90: 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
2fa0: 70 72 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d  pr;.      pScan-
2fb0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
2fc0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
2fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
2fe0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
2ff0: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
3000: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52    iColumn = XN_R
3010: 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  OWID;.    }else 
3020: 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
3030: 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 69  {.      pScan->i
3040: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3050: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3060: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3070: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
3080: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
3090: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  oll[j];.    }.  
30a0: 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d  }else if( iColum
30b0: 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  n==XN_EXPR ){.  
30c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
30d0: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
30e0: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
30f0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
3100: 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69 43  n->aiCur[0] = iC
3110: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43  ur;.  pScan->aiC
3120: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75  olumn[0] = iColu
3130: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
3140: 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e  uiv = 1;.  pScan
3150: 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20 20  ->iEquiv = 1;.  
3160: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
3170: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
3180: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
3190: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
31b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
31c0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
31d0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
31e0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31f0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
3200: 65 20 69 43 75 72 20 6f 72 20 6f 66 20 69 6e 64  e iCur or of ind
3210: 65 78 20 70 49 64 78 0a 2a 2a 20 69 66 20 70 49  ex pIdx.** if pI
3220: 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69  dx!=0 and <op> i
3230: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f  s one of the WO_
3240: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3250: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 2a  s specified by.*
3260: 2a 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  * the op paramet
3270: 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  er.  Return a po
3280: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
3290: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
32a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
32b0: 20 49 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e   If pIdx!=0 then
32c0: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   it must be one 
32d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f  of the indexes o
32e0: 66 20 74 61 62 6c 65 20 69 43 75 72 2e 20 20 0a  f table iCur.  .
32f0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 65  ** Search for te
3300: 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74 68 65  rms matching the
3310: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
3320: 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61  mn of pIdx.** ra
3330: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 43  ther than the iC
3340: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3350: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a  of table iCur..*
3360: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
3370: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
3380: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
3390: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
33a0: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
33b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
33c0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
33d0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
33e0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
33f0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
3400: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
3410: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
3420: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3430: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
3440: 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b  iCur[]/iaColumn[
3450: 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20 58 20  ] arrays hold X 
3460: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
3470: 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65 20 61  valents. There a
3480: 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69  re 11.** slots i
3490: 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75  n aiCur[]/aiColu
34a0: 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d 65 61  mn[] so that mea
34b0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
34c0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
34d0: 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71 75 69  10.** other equi
34e0: 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 20 20  valent values.  
34f0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
3500: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
3510: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 0a   <expr> if X=A1.
3520: 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  ** and A1=A2 and
3530: 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61   A2=A3 and ... a
3540: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
3550: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
3560: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
3570: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
3580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3590: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
35a0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
35b0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
35c0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
35d0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
35e0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
35f0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
3600: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
3610: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
3620: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
3630: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
3640: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
3650: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
3660: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
3670: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
3680: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
3690: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
36a0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
36b0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
36c0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
36d0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
36e0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
36f0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
3700: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
3710: 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  IV..*/.WhereTerm
3720: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46 69   *sqlite3WhereFi
3730: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3740: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3750: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3760: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3770: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3790: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37a0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37b0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
37c0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
37d0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
37e0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
37f0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3800: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3810: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3820: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
3830: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3840: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3850: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
3860: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
3870: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
3880: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
3890: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38a0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38b0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
38c0: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
38d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
38e0: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
38f0: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
3900: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
3910: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
3920: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f  , op, pIdx);.  o
3930: 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  p &= WO_EQ|WO_IS
3940: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
3950: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
3960: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3970: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
3980: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
3990: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
39a0: 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b  erator&op)!=0 ){
39b0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
39c0: 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20  e( p->eOperator 
39d0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
39e0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
39f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3a00: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
3a10: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
3a20: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
3a30: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
3a40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
3a50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
3a60: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
3a70: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20  es pList for an 
3a80: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
3a90: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
3aa0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
3ab0: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
3ac0: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
3ad0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
3ae0: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
3af0: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
3b00: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
3b10: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
3b20: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
3b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3b40: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
3b50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3b80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3b90: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
3ba0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3bb0: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
3bc0: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
3bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3be0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3bf0: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
3c00: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
3c10: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c30: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3c40: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
3c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3c80: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
3c90: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
3ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3cb0: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
3cc0: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
3cd0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
3ce0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
3cf0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3d00: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3d10: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
3d20: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3d30: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
3d40: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
3d50: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
3d60: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
3d70: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
3d80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
3d90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
3da0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
3db0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3dc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3dd0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
3de0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3df0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
3e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3e10: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
3e20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3e30: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
3e40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
3e50: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
3e60: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69   of index pIdx i
3e70: 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  s NOT NULL.*/.st
3e80: 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f  atic int indexCo
3e90: 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  lumnNotNull(Inde
3ea0: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
3eb0: 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  l){.  int j;.  a
3ec0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
3ed0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
3ee0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78  >=0 && iCol<pIdx
3ef0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a  ->nColumn );.  j
3f00: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
3f10: 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a  n[iCol];.  if( j
3f20: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
3f30: 6e 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  n pIdx->pTable->
3f40: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[j].notNull;
3f50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d  .  }else if( j==
3f60: 28 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (-1) ){.    retu
3f70: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
3f80: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d     assert( j==(-
3f90: 32 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  2) );.    return
3fa0: 20 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61   0;  /* Assume a
3fb0: 6e 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  n indexed expres
3fc0: 73 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20  sion can always 
3fd0: 79 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a  yield a NULL */.
3fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3ff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
4000: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
4010: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
4020: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
4030: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
4040: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
4050: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
4060: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e   redundant if an
4070: 79 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  y subset of the 
4080: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a  columns in the.*
4090: 2a 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  * DISTINCT list 
40a0: 61 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79  are collectively
40b0: 20 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69   unique and indi
40c0: 76 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c  vidually non-nul
40d0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
40e0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
40f0: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
4100: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4110: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
4120: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
4130: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
4140: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
4150: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4160: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
4180: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
4190: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
41a0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
41b0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
41c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
41d0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
41e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
41f0: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
4200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4210: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
4220: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
4230: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
4240: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
4250: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
4260: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4270: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
4280: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
4290: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
42a0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
42b0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
42c0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
42d0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
42e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
42f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4300: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
4310: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
4320: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
4330: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
4340: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
4350: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
4360: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
4370: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
4380: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
4390: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
43a0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
43b0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
43c0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
43d0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
43e0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
43f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
4400: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
4410: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
4420: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
4430: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
4440: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
4450: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
4460: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
4470: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
4480: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
4490: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
44a0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
44b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
44c0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
44d0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
44e0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
44f0: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
4500: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4520: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
4530: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
4540: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
4550: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
4560: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
4570: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
4580: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
4590: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
45a0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
45b0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
45c0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
45d0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
45e0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
45f0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
4600: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
4610: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
4620: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
4630: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
4640: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
4650: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
4660: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
4670: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
4680: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
4690: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
46a0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
46b0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
46c0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
46d0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
46e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
46f0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
4700: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
4710: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
4720: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
4730: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
4740: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4750: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4760: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4770: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
4780: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
4790: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
47a0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
47b0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
47c0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
47d0: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
47e0: 43 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42  C, iBase, i, ~(B
47f0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
4800: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
4810: 20 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43    if( findIndexC
4820: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
4830: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
4840: 78 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b  x, i)<0 ) break;
4850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64  .        if( ind
4860: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
4870: 70 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72  pIdx, i)==0 ) br
4880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4890: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
48a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
48b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
48c0: 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
48d0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
48e0: 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
48f0: 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
4900: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4910: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
4920: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  .../*.** Estimat
4930: 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
4940: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
4950: 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
4960: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65  .static LogEst e
4970: 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b  stLog(LogEst N){
4980: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20  .  return N<=10 
4990: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67  ? 0 : sqlite3Log
49a0: 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a  Est(N) - 33;.}..
49b0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50  /*.** Convert OP
49c0: 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20  _Column opcodes 
49d0: 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72  to OP_Copy in pr
49e0: 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
49f0: 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed code..**.** T
4a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
4a10: 20 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20   over generated 
4a20: 56 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72  VDBE code and tr
4a30: 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75  anslates OP_Colu
4a40: 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e  mn.** opcodes in
4a50: 74 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20  to OP_Copy when 
4a60: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
4a70: 6e 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20  ng accessed via 
4a80: 63 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69  co-routine .** i
4a90: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61  nstead of via ta
4aa0: 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a  ble lookup..**.*
4ab0: 2a 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f  * If the bIncrRo
4ac0: 77 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  wid parameter is
4ad0: 20 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f   0, then any OP_
4ae0: 52 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f  Rowid instructio
4af0: 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20  ns on.** cursor 
4b00: 69 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e  iTabCur are tran
4b10: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f  sformed into OP_
4b20: 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e  Null. Or, if bIn
4b30: 63 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  crRowid is non-z
4b40: 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63  ero,.** then eac
4b50: 68 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72  h OP_Rowid is tr
4b60: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61  ansformed into a
4b70: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
4b80: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a   increment the.*
4b90: 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  * value stored i
4ba0: 6e 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67  n its output reg
4bb0: 69 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ister..*/.static
4bc0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43   void translateC
4bd0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50  olumnToCopy(.  P
4be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4bf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4c00: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
4c10: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4c20: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4c30: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4c40: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4c50: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4c60: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4c70: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4c80: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4ca0: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4cb0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
4cc0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
4cd0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
4ce0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
4cf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
4d00: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
4d10: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4d20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4d30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4d40: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71  VdbeOp *pOp = sq
4d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
4d60: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74  , iStart);.  int
4d70: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
4d80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4d90: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
4da0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4db0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  d ) return;.  fo
4dc0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
4dd0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
4de0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
4df0: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4e00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4e10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4e20: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4e30: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4e40: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4e50: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4e60: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4e70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4e80: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4e90: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
4ea0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
4eb0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
4ec0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
4ed0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
4ee0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
4ef0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4f00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4f10: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4f20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4f30: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4f40: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4f50: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4f60: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4f70: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4f80: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4f90: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
4fa0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
4fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
4fc0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
4fd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4fe0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
4ff0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
5000: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
5010: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5020: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
5030: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
5040: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
5050: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
5060: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
5070: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
5080: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
5090: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
50a0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
50b0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
50c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
50d0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
50e0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
50f0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
5100: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
5110: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
5120: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5140: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5150: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5170: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5180: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5190: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
51a0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
51b0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
51c0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
51d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
51e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
51f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5200: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
5210: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
5220: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
5230: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
5240: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5250: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
5260: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
5270: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
5280: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5290: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
52a0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
52b0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
52c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
52d0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
52e0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
52f0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
5300: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
5310: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
5320: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
5330: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5340: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5350: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5360: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5370: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5380: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5390: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
53a0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
53b0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
53c0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
53d0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
53e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
53f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
5400: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5410: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
5420: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
5430: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
5440: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
5450: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
5460: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5470: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
5480: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
5490: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
54a0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
54b0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
54c0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
54d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
54e0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
54f0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
5500: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
5510: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5520: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5530: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
5540: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
5550: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
5560: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
5570: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
5580: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
5590: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
55a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55b0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
55d0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
55e0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
55f0: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
5600: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
5610: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
5620: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
5630: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
5640: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
5650: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
5660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
5670: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
5680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5690: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
56a0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
56b0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
56c0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
56d0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
56e0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
56f0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
5700: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
5710: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5730: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
5740: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
5750: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5760: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5770: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
5780: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
5790: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
57a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
57b0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
57c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
57d0: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
57e0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20  pe & JT_LEFT) . 
57f0: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5800: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
5810: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5820: 0a 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  .   && (pTerm->e
5830: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
5840: 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ).  ){.    /* Ca
5850: 6e 6e 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74  nnot use an IS t
5860: 65 72 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45  erm from the WHE
5870: 52 45 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20  RE clause as an 
5880: 69 6e 64 65 78 20 64 72 69 76 65 72 20 66 6f 72  index driver for
5890: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
58a0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
58b0: 53 75 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20  Such a term can 
58c0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
58d0: 69 74 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a  it is from.    *
58e0: 2a 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  * the ON clause.
58f0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
5900: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54  0;.  }.  if( (pT
5910: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5920: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
5930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5940: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
5950: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
5960: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
5970: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
5980: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5990: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
59a0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
59b0: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
59c0: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
59d0: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
59e0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
59f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
5a00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5a10: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
5a20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
5a30: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
5a40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5a50: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
5a60: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
5a70: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
5a80: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
5a90: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
5aa0: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
5ab0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
5ac0: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
5ad0: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
5ae0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b00: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
5b10: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
5b20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5b40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b50: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
5b60: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
5b70: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5b80: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
5b90: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
5ba0: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
5bb0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5bc0: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
5bd0: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
5be0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
5bf0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
5c00: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5c10: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
5c20: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
5c30: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
5c40: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
5c50: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
5c60: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
5c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5c80: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5c90: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
5ca0: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
5cb0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
5cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5cd0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
5ce0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5cf0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
5d00: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
5d10: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
5d20: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
5d30: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5d40: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
5d50: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
5d60: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
5d70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d90: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
5da0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
5db0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5dc0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5de0: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
5df0: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
5e00: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
5e10: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
5e40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
5e50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5e60: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5e70: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
5e80: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
5e90: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
5ea0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5eb0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
5ec0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5ef0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5f00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5f20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5f30: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
5f50: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
5f60: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
5f70: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5f90: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
5fa0: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
5fb0: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
5fc0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
5fd0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
5fe0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
5ff0: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
6000: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
6010: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
6020: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
6030: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
6040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6050: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
6060: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
6070: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
6080: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
6090: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
60a0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
60b0: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
60c0: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
60d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
60e0: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
60f0: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
6100: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
6110: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
6120: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
6130: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
6140: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
6150: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6160: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
6170: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  luded rows */.  
6180: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
6190: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
61a0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
61b0: 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65  erm being indexe
61c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  d */.  int addrC
61d0: 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20  ounter = 0;     
61e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68     /* Address wh
61f0: 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e  ere integer coun
6200: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
6210: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  ed */.  int regB
6220: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
6230: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6240: 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20  registers where 
6250: 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62  record is assemb
6260: 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  led */..  /* Gen
6270: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
6280: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
6290: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
62a0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
62b0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
62c0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
62d0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
62e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
62f0: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
6300: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6310: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
6320: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
6330: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6340: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
6350: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
6360: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6370: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
6380: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
6390: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
63a0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
63b0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
63c0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
63d0: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
63e0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
63f0: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
6400: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
6410: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
6420: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
6430: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
6440: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
6450: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
6460: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
6470: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
6480: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
6490: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
64a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
64b0: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
64c0: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
64d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
64e0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
64f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
6500: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
6510: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
6520: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
6530: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
6540: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6560: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
6570: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
6580: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
6590: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
65a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
65b0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
65c0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
65d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
65e0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
65f0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
6600: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
6610: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
6620: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
6630: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
6640: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6650: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6680: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
6690: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
66a0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
66b0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
66c0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
66d0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
66e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
66f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6700: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6710: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6720: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6730: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6740: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6750: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6760: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
6770: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6780: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
6790: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
67a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
67b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
67c0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
67d0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
67e0: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
67f0: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6800: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6810: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
6820: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
6830: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
6840: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6850: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
6860: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
6870: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6880: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
6890: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
68a0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
68b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
68c0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
68d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68e0: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
68f0: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6900: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6910: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6930: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6940: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6950: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6960: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6970: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6980: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
6990: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
69a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
69b0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
69e0: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
69f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6a00: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6a10: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6a20: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6a30: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6a40: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6a50: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6a60: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6a70: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6a80: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6a90: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6aa0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6ab0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6ac0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6ad0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6ae0: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6af0: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6b00: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6b10: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6b20: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6b30: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6b40: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6b50: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6b60: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6b70: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6b80: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6b90: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6ba0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6bb0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6bc0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6bd0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6be0: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6bf0: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6c00: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6c10: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6c20: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6c30: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6c40: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6c50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6c60: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6c70: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6c80: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6c90: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6ca0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6cb0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6cc0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6cd0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6ce0: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6cf0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6d00: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6d10: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6d20: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6d30: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6d40: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6d50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6d60: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6d70: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6d80: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6d90: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6da0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6db0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6dc0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6dd0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6de0: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6df0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6e00: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6e10: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6e20: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6e30: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6e40: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6e50: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6e60: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6e70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
6e80: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6e90: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
6ea0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
6eb0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
6ec0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
6ed0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
6ee0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6ef0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
6f00: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6f10: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
6f20: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
6f30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f40: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
6f50: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6f60: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6f70: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
6f80: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
6f90: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6fa0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
6fb0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
6fc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
6fd0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6fe0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
6ff0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
7000: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
7010: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7020: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7030: 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  Y;.        n++;.
7040: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7050: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
7060: 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
7070: 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
7080: 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
7090: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
70a0: 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
70b0: 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
70c0: 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
70d0: 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
70e0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
70f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
7100: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
7110: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
7120: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
7130: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
7140: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69  azColl[n] = sqli
7150: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
7160: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
7170: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
7180: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
7190: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
71a0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
71b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
71c0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
71d0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
71e0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
71f0: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
7200: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e  rBINARY;.      n
7210: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
7220: 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43  assert( n==nKeyC
7230: 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  ol );.  pIdx->ai
7240: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52  Column[n] = XN_R
7250: 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  OWID;.  pIdx->az
7260: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7270: 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f  3StrBINARY;..  /
7280: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
7290: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
72a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
72b0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
72c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
72d0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
72e0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
72f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7300: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
7310: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
7320: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
7330: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
7340: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
7350: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
7360: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
7370: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
7380: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
7390: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
73a0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
73b0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
73c0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
73d0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
73e0: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
73f0: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
7400: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
7410: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
7430: 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72  .    addrCounter
7440: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7450: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7460: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
7470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7480: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
7490: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
74a0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
74b0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
74c0: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
74e0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
74f0: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
7500: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7510: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7520: 78 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70  xt row of %s", p
7530: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
7540: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
7550: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
7560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7570: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
7580: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
7590: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
75a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
75b0: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
75c0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
75d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
75e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
75f0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7600: 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69  pPartial, iConti
7610: 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  nue, SQLITE_JUMP
7620: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f  IFNULL);.    pLo
7630: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
7640: 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 3b  HERE_PARTIALIDX;
7650: 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72 64  .  }.  regRecord
7660: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7670: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7680: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
7690: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
76a0: 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2c  y(.      pParse,
76b0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
76c0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
76d0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20  d, 0, 0, 0, 0.  
76e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
76f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7700: 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
7710: 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
7720: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
7730: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7740: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
7750: 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72 74  LT);.  if( pPart
7760: 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ial ) sqlite3Vdb
7770: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7780: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69   iContinue);.  i
7790: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
77a0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
77b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77c0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 43  hangeP2(v, addrC
77d0: 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65 2b  ounter, regBase+
77e0: 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  n);.    testcase
77f0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
7800: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7810: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
7820: 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20  nToCopy(pParse, 
7830: 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d  addrTop, pLevel-
7840: 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65      pTabItem->re
7870: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
7880: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
7890: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
78a0: 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76    pTabItem->fg.v
78b0: 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b  iaCoroutine = 0;
78c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
78d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
78e0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
78f0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
7900: 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rTop+1); VdbeCov
7910: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7930: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
7940: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
7950: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
7960: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7970: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
7980: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7990: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
79a0: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
79b0: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
79c0: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
79d0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
79e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
79f0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
7a00: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
7a10: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
7a20: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7a30: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
7a40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7a50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
7a60: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
7a70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7a80: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
7a90: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
7aa0: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
7ab0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7ac0: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
7ad0: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
7ae0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
7af0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
7b00: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
7b10: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
7b20: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
7b30: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
7b40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
7b50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
7b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
7b70: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
7b80: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
7b90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7ba0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7bb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
7bc0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7bd0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7bf0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7c00: 75 73 65 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  use being analyz
7c10: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
7c20: 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20  mUnusable,      
7c30: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
7c40: 65 20 74 65 72 6d 73 20 77 69 74 68 20 74 68 65  e terms with the
7c50: 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20  se prereqs */.  
7c60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7c70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
7c80: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7c90: 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
7ca0: 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 45 78  the vtab */.  Ex
7cb0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7cd0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
7ce0: 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 2a 70  ause */.  u16 *p
7cf0: 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20  mNoOmit         
7d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
7d10: 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74  k of terms not t
7d20: 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  o omit */.){.  i
7d30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
7d40: 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
7d50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7d60: 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
7d70: 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
7d80: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7d90: 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
7da0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7db0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7dc0: 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
7dd0: 0a 20 20 73 74 72 75 63 74 20 48 69 64 64 65 6e  .  struct Hidden
7de0: 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64  IndexInfo *pHidd
7df0: 65 6e 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  en;.  WhereTerm 
7e00: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
7e10: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
7e20: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
7e30: 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e  dxInfo;.  u16 mN
7e40: 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oOmit = 0;..  /*
7e50: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
7e60: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
7e70: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
7e80: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
7e90: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
7ea0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
7eb0: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
7ec0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7ed0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7ee0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
7ef0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7f00: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7f10: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7f20: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7f30: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7f40: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7f50: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7f60: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7f70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7f80: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7f90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7fa0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7fb0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7fc0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7fd0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
7fe0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
7ff0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
8000: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
8010: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8020: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8030: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
8040: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8050: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55  rator & ~(WO_EQU
8060: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
8070: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
8080: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8090: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
80a0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
80b0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
80c0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
80d0: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
80e0: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
80f0: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
8100: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
8110: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
8120: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
8130: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
8140: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
8150: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
8160: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
8170: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
8180: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
8190: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
81a0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
81b0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
81c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
81d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
81e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
81f0: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
8200: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
8210: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
8220: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
8230: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
8240: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
8250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8260: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
8270: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
8280: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
8290: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
82a0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
82b0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
82c0: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
82d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
82e0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
82f0: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
8320: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
8330: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
8340: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
8370: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
8380: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 69 64 64   + sizeof(*pHidd
8390: 65 6e 29 20 29 3b 0a 20 20 69 66 28 20 70 49 64  en) );.  if( pId
83a0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
83b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
83c0: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
83d0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
83e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
83f0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8400: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8410: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8420: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
8430: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
8440: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
8450: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
8460: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
8470: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
8480: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
8490: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
84a0: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
84b0: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
84c0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
84d0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
84e0: 2f 0a 20 20 70 48 69 64 64 65 6e 20 3d 20 28 73  /.  pHidden = (s
84f0: 74 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65  truct HiddenInde
8500: 78 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f  xInfo*)&pIdxInfo
8510: 5b 31 5d 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  [1];.  pIdxCons 
8520: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
8530: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8540: 6e 74 2a 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b  nt*)&pHidden[1];
8550: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
8560: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
8570: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
8580: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
8590: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
85a0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
85b0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
85c0: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
85d0: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
85e0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
85f0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
8600: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
8610: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
8620: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
8630: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8640: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8650: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
8660: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
8670: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
8680: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
8690: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
86a0: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
86b0: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
86c0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
86d0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
86e0: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
86f0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8700: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
8750: 65 3b 0a 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70  e;..  pHidden->p
8760: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 48 69 64  WC = pWC;.  pHid
8770: 64 65 6e 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  den->pParse = pP
8780: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  arse;.  for(i=j=
8790: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
87a0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
87b0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
87c0: 20 20 75 31 36 20 6f 70 3b 0a 20 20 20 20 69 66    u16 op;.    if
87d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
87e0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
87f0: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
8800: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8810: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
8820: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
8830: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8840: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
8850: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8860: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
8870: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8880: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8890: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
88a0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
88b0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
88c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
88d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
88e0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
88f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8900: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8910: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
8920: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8930: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49  ator & ~(WO_EQUI
8940: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
8950: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
8960: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8970: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
8980: 65 3b 0a 20 20 20 20 69 66 28 20 28 70 53 72 63  e;.    if( (pSrc
8990: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
89a0: 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20  JT_LEFT)!=0.    
89b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
89c0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
89d0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
89e0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
89f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8a00: 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 0a 20  IS|WO_ISNULL)). 
8a10: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41     ){.      /* A
8a20: 6e 20 22 49 53 22 20 74 65 72 6d 20 69 6e 20 74  n "IS" term in t
8a30: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
8a40: 77 68 65 72 65 20 74 68 65 20 76 69 72 74 75 61  where the virtua
8a50: 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  l table is the r
8a60: 68 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  hs.      ** of a
8a70: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 44 6f 20 6e   LEFT JOIN. Do n
8a80: 6f 74 20 70 61 73 73 20 74 68 69 73 20 74 65 72  ot pass this ter
8a90: 6d 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  m to the virtual
8aa0: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
8ab0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
8ac0: 61 73 20 74 68 69 73 20 63 61 6e 20 6c 65 61 64  as this can lead
8ad0: 20 74 6f 20 69 6e 63 6f 72 72 65 63 74 20 72 65   to incorrect re
8ae0: 73 75 6c 74 73 20 66 72 6f 6d 20 53 51 4c 20 73  sults from SQL s
8af0: 75 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 73 3a  uch.      ** as:
8b00: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
8b10: 2a 2a 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20  **   "LEFT JOIN 
8b20: 76 74 61 62 20 57 48 45 52 45 20 76 74 61 62 2e  vtab WHERE vtab.
8b30: 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 20 2a 2f  col IS NULL"  */
8b40: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
8b50: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
8b60: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
8b70: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
8b80: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8b90: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
8ba0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
8bb0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
8bc0: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
8bd0: 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e      op = pTerm->
8be0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
8bf0: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
8c00: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
8c10: 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  EQ;.    if( op==
8c20: 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20 20 20 20  WO_AUX ){.      
8c30: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8c40: 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70   pTerm->eMatchOp
8c50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8c60: 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  op & (WO_ISNULL|
8c70: 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20  WO_IS) ){.      
8c80: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c  if( op==WO_ISNUL
8c90: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  L ){.        pId
8ca0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51  xCons[j].op = SQ
8cb0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8cc0: 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20  RAINT_ISNULL;.  
8cd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ce0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
8cf0: 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  p = SQLITE_INDEX
8d00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b 0a  _CONSTRAINT_IS;.
8d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8d20: 65 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  e{.      pIdxCon
8d30: 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f 70  s[j].op = (u8)op
8d40: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ;.      /* The d
8d50: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
8d60: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
8d70: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
8d80: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
8d90: 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20       ** the WO_ 
8da0: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
8db0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
8dc0: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
8dd0: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
8de0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
8df0: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
8e00: 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ct. */.      ass
8e10: 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
8e20: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
8e30: 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  INT_EQ );.      
8e40: 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
8e50: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8e60: 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
8e70: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
8e80: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8e90: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
8ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8eb0: 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
8ec0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
8ed0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8ee0: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
8ef0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8f00: 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
8f10: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
8f20: 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45  ator&(WO_IN|WO_E
8f30: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
8f40: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 41 55 58  _GT|WO_GE|WO_AUX
8f50: 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
8f60: 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  op & (WO_LT|WO_L
8f70: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20  E|WO_GT|WO_GE). 
8f80: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
8f90: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 54 65  ExprIsVector(pTe
8fa0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
8fb0: 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t) .      ){.   
8fc0: 20 20 20 20 20 69 66 28 20 69 3c 31 36 20 29 20       if( i<16 ) 
8fd0: 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c 3c  mNoOmit |= (1 <<
8fe0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
8ff0: 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49 64   op==WO_LT ) pId
9000: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f  xCons[j].op = WO
9010: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _LE;.        if(
9020: 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49 64   op==WO_GT ) pId
9030: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f  xCons[j].op = WO
9040: 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _GE;.      }.   
9050: 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   }..    j++;.  }
9060: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
9070: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
9080: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
9090: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
90a0: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
90b0: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
90c0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
90d0: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
90e0: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
90f0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
9100: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70  Order;.  }..  *p
9110: 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69  mNoOmit = mNoOmi
9120: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  t;.  return pIdx
9130: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
9140: 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
9150: 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
9160: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
9170: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9180: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
9190: 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
91a0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
91b0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
91c0: 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
91d0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
91e0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
91f0: 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
9200: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62  e3_index_info ob
9210: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d  ject that.** com
9220: 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64  es in as the 3rd
9230: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
9240: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
9250: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
9260: 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
9270: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
9280: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
9290: 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  and a.** non-zer
92a0: 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  o value is retur
92b0: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
92c0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  0 is returned an
92d0: 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
92e0: 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69  part of the sqli
92f0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
9300: 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74  tructure is left
9310: 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a   populated..**.*
9320: 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
9330: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
9340: 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65  urned, it is the
9350: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
9360: 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
9370: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
9380: 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66  ree p->idxStr if
9390: 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
93a0: 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a  xStr indicates.*
93b0: 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72  * that this is r
93c0: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
93d0: 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49  ic int vtabBestI
93e0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
93f0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
9400: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
9410: 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  nfo *p){.  sqlit
9420: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
9430: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
9440: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
9450: 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e  ab)->pVtab;.  in
9460: 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
9470: 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
9480: 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
9490: 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
94a0: 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
94b0: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
94c0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
94d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
94e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
94f0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
9500: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61  ite3OomFault(pPa
9510: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65  rse->db);.    }e
9520: 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
9530: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
9540: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9550: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
9560: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
9570: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9580: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9590: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
95a0: 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
95b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
95c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
95d0: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
95e0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
95f0: 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54  0;..#if 0.  /* T
9600: 68 69 73 20 65 72 72 6f 72 20 69 73 20 6e 6f 77  his error is now
9610: 20 63 61 75 67 68 74 20 62 79 20 74 68 65 20 63   caught by the c
9620: 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53 65 61 72  aller..  ** Sear
9630: 63 68 20 66 6f 72 20 22 78 42 65 73 74 49 6e 64  ch for "xBestInd
9640: 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 20  ex malfunction" 
9650: 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f 72 28 69  below */.  for(i
9660: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
9670: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
9680: 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
9690: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
96a0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
96b0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
96c0: 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
96d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
96e0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
96f0: 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
9700: 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
9710: 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
9720: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
9730: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
9740: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
9750: 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
9760: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
9770: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
9780: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65  TABLE) */..#ifde
9790: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
97a0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
97b0: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
97c0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
97d0: 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
97e0: 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
97f0: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
9800: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
9810: 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
9820: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
9830: 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
9840: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
9850: 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a   less than pRec.
9860: 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
9870: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
9880: 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
9890: 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pRec.**.** Retu
98a0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
98b0: 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20  the sample that 
98c0: 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  is the smallest 
98d0: 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69  sample that.** i
98e0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
98f0: 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e  r equal to pRec.
9900: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
9910: 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20  index is not an 
9920: 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68  index.** into th
9930: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9940: 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64  y - it is an ind
9950: 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61  ex into a virtua
9960: 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  l set of samples
9970: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
9980: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61   contents of aSa
9990: 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e  mple[] and the n
99a0: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
99b0: 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52  in record .** pR
99c0: 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ec. .*/.static i
99d0: 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
99e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
99f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9a00: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9a10: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
9a20: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
9a30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9a40: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
9a50: 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
9a60: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
9a70: 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
9a80: 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
9a90: 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
9aa0: 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
9ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
9ac0: 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
9ad0: 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
9ae0: 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
9af0: 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
9b00: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
9b10: 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
9b20: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
9b30: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
9b40: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
9b50: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
9b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9b70: 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
9b80: 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
9b90: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  etc. */.  int i;
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
9bc0: 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e  f first sample >
9bd0: 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  = pRec */.  int 
9be0: 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  iSample;        
9bf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
9c00: 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65  est sample large
9c10: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
9c20: 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74  to pRec */.  int
9c30: 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
9c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
9c50: 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
9c60: 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
9c70: 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9c90: 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
9ca0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
9cd0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
9ce0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
9cf0: 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Field;          
9d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9d10: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52   of fields in pR
9d20: 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ec */.  tRowcnt 
9d30: 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20  iLower = 0;     
9d40: 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20      /* anLt[] + 
9d50: 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73  anEq[] of larges
9d60: 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73  t sample pRec is
9d70: 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53   > */..#ifndef S
9d80: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
9d90: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
9da0: 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66  pParse );.#endif
9db0: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21  .  assert( pRec!
9dc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9dd0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  pIdx->nSample>0 
9de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
9df0: 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  c->nField>0 && p
9e00: 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64  Rec->nField<=pId
9e10: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
9e20: 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61  ..  /* Do a bina
9e30: 72 79 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e  ry search to fin
9e40: 64 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  d the first samp
9e50: 6c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  le greater than 
9e60: 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f  or equal.  ** to
9e70: 20 70 52 65 63 2e 20 49 66 20 70 52 65 63 20 63   pRec. If pRec c
9e80: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
9e90: 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20   field, the set 
9ea0: 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65  of samples to se
9eb0: 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d  arch.  ** is sim
9ec0: 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  ply the aSample[
9ed0: 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20  ] array. If the 
9ee0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
9ef0: 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  le[] contain mor
9f00: 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20  e.  ** than one 
9f10: 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c  fields, all fiel
9f20: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ds following the
9f30: 20 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72   first are ignor
9f40: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
9f50: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e   pRec contains N
9f60: 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e   fields, where N
9f70: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
9f80: 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20  e, then as well 
9f90: 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70  as the.  ** samp
9fa0: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
9fb0: 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e   (truncated to N
9fc0: 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65   fields), the se
9fd0: 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f  arch also has to
9fe0: 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70  .  ** consider p
9ff0: 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65  refixes of those
a000: 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78   samples. For ex
a010: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65  ample, if the se
a020: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a  t of samples.  *
a030: 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a  * in aSample is:
a040: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61  .  **.  **     a
a050: 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20  Sample[0] = (a, 
a060: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
a070: 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30  mple[1] = (a, 10
a080: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
a090: 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20  ple[2] = (b, 5) 
a0a0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a0b0: 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20  e[3] = (c, 100) 
a0c0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a0d0: 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a  e[4] = (c, 105).
a0e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
a0f0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
a100: 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62  should ideally b
a110: 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62  e the samples ab
a120: 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ove and the .  *
a130: 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 65  * unique prefixe
a140: 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b  s [a], [b] and [
a150: 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68  c]. But since th
a160: 61 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72  at is hard to or
a170: 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68  ganize, .  ** th
a180: 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20  e code actually 
a190: 73 65 61 72 63 68 65 73 20 74 68 69 73 20 73 65  searches this se
a1a0: 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t:.  **.  **    
a1b0: 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20   0: (a) .  **   
a1c0: 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a    1: (a, 5) .  *
a1d0: 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29  *     2: (a, 10)
a1e0: 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61   .  **     3: (a
a1f0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
a200: 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20  4: (b) .  **    
a210: 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a   5: (b, 5) .  **
a220: 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a       6: (c) .  *
a230: 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30  *     7: (c, 100
a240: 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28  ) .  **     8: (
a250: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20  c, 105).  **    
a260: 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   9: (c, 105).  *
a270: 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  *.  ** For each 
a280: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53  sample in the aS
a290: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e  ample[] array, N
a2a0: 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65   samples are pre
a2b0: 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a  sent in the.  **
a2c0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a2d0: 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20  e array. In the 
a2e0: 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30  above, samples 0
a2f0: 20 61 6e 64 20 31 20 61 72 65 20 62 61 73 65 64   and 1 are based
a300: 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   on .  ** sample
a310: 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d   aSample[0]. Sam
a320: 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20  ples 2 and 3 on 
a330: 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a  aSample[1] etc..
a340: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c    **.  ** Often,
a350: 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63   sample i of eac
a360: 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66  h block of N eff
a370: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68  ective samples h
a380: 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e  as (i+1) fields.
a390: 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61  .  ** Except, ea
a3a0: 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65  ch sample may be
a3b0: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73   extended to ens
a3c0: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 67  ure that it is g
a3d0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20  reater than or. 
a3e0: 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65   ** equal to the
a3f0: 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65   previous sample
a400: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46   in the array. F
a410: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74  or example, in t
a420: 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20  he above, .  ** 
a430: 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20  sample 2 is the 
a440: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20  first sample of 
a450: 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d  a block of N sam
a460: 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73  ples, so at firs
a470: 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61  t it .  ** appea
a480: 72 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  rs that it shoul
a490: 64 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20  d be 1 field in 
a4a0: 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  size. However, t
a4b0: 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69  hat would make i
a4c0: 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20  t .  ** smaller 
a4d0: 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73  than sample 1, s
a4e0: 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
a4f0: 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f  rch would not wo
a500: 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c  rk. As a result,
a510: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74   .  ** it is ext
a520: 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65  ended to two fie
a530: 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61  lds. The duplica
a540: 74 65 73 20 74 68 61 74 20 74 68 69 73 20 63 72  tes that this cr
a550: 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20  eates do not .  
a560: 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
a570: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46  blems..  */.  nF
a580: 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69  ield = pRec->nFi
a590: 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b  eld;.  iCol = 0;
a5a0: 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64  .  iSample = pId
a5b0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69  x->nSample * nFi
a5c0: 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  eld;.  do{.    i
a5d0: 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20  nt iSamp;       
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5f0: 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65  Index in aSample
a600: 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c  [] of test sampl
a610: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20  e */.    int n; 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a640: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65   of fields in te
a650: 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20  st sample */..  
a660: 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b    iTest = (iMin+
a670: 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20  iSample)/2;.    
a680: 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20  iSamp = iTest / 
a690: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20  nField;.    if( 
a6a0: 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  iSamp>0 ){.     
a6b0: 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64   /* The proposed
a6c0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a6d0: 65 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  e is a prefix of
a6e0: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
a6f0: 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a  iSamp]..      **
a700: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
a710: 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66  he shortest pref
a720: 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ix of at least (
a730: 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64  1 + iTest%nField
a740: 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c  ) .      ** fiel
a750: 64 73 20 74 68 61 74 20 69 73 20 67 72 65 61 74  ds that is great
a760: 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
a770: 69 6f 75 73 20 65 66 66 65 63 74 69 76 65 20 73  ious effective s
a780: 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  ample.  */.     
a790: 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20   for(n=(iTest % 
a7a0: 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e  nField) + 1; n<n
a7b0: 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20  Field; n++){.   
a7c0: 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
a7d0: 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e  [iSamp-1].anLt[n
a7e0: 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61  -1]!=aSample[iSa
a7f0: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20  mp].anLt[n-1] ) 
a800: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a810: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a820: 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20  n = iTest + 1;. 
a830: 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e     }..    pRec->
a840: 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20  nField = n;.    
a850: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
a860: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a870: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c  Sample[iSamp].n,
a880: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
a890: 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66  p, pRec);.    if
a8a0: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
a8b0: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
a8c0: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
a8d0: 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61  1] + aSample[iSa
a8e0: 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20  mp].anEq[n-1];. 
a8f0: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
a900: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t+1;.    }else i
a910: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e  f( res==0 && n<n
a920: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69  Field ){.      i
a930: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
a940: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a950: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
a960: 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65  Test+1;.      re
a970: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  s = -1;.    }els
a980: 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65  e{.      iSample
a990: 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20   = iTest;.      
a9a0: 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20  iCol = n-1;.    
a9b0: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
a9c0: 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20  && iMin<iSample 
a9d0: 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65  );.  i = iSample
a9e0: 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64   / nField;..#ifd
a9f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
aa00: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
aa10: 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
aa20: 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
aa30: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
aa40: 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
aa50: 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
aa60: 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
aa70: 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
aa80: 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
aa90: 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
aaa0: 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
aab0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
aac0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
aad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==0 ){.    if( r
aae0: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
aaf0: 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
ab00: 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63   true, then pRec
ab10: 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
ab20: 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20  o sample i. */. 
ab30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
ab40: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
ab50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ab60: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
ab70: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
ab80: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ld = nField;.   
ab90: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
aba0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
abb0: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
abc0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
abd0: 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20 20  p, pRec) .      
abe0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
abf0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ac00: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d   .      );.    }
ac10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
ac20: 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e  nless i==pIdx->n
ac30: 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69  Sample, indicati
ac40: 6e 67 20 74 68 61 74 20 70 52 65 63 20 69 73 20  ng that pRec is 
ac50: 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
ac60: 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73    ** all samples
ac70: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
ac80: 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75  ] array, pRec mu
ac90: 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
aca0: 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  an the.      ** 
acb0: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
acc0: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
acd0: 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  i.  */.      ass
ace0: 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53  ert( i<=pIdx->nS
acf0: 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b  ample && i>=0 );
ad00: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  .      pRec->nFi
ad10: 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  eld = iCol+1;.  
ad20: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
ad30: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
ad40: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
ad50: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
ad60: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
ad70: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
ad80: 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
ad90: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
ada0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
adb0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  );..      /* if 
adc0: 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30  i==0 and iCol==0
add0: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52  , then record pR
ade0: 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ec is smaller th
adf0: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20  an all samples. 
ae00: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61       ** in the a
ae10: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
ae20: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 28 69  Otherwise, if (i
ae30: 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63  Col>0) then pRec
ae40: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
ae50: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
ae60: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28  r equal to the (
ae70: 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66  iCol) field pref
ae80: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a  ix of sample i..
ae90: 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30        ** If (i>0
aea0: 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  ), then pRec mus
aeb0: 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65  t also be greate
aec0: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69  r than sample (i
aed0: 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  -1).  */.      i
aee0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
aef0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
af00: 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  d = iCol;.      
af10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
af20: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
af30: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
af40: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
af50: 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20  Rec)<=0.        
af60: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
af70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
af80: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
af90: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
afa0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
afb0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
afc0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
afd0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
afe0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
aff0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
b000: 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
b010: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
b020: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
b030: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
b040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b050: 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
b060: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66  E_DEBUG */..  if
b070: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
b080: 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20 69  /* Record pRec i
b090: 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  s equal to sampl
b0a0: 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e i */.    asser
b0b0: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
b0c0: 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  1 );.    aStat[0
b0d0: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
b0e0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
b0f0: 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
b100: 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
b110: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
b120: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
b130: 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65  the (iCol+1) fie
b140: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61 53 61  ld prefix of aSa
b150: 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
b160: 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d  irst .    ** sam
b170: 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
b180: 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f  ter than pRec. O
b190: 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  r, if i==pIdx->n
b1a0: 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63  Sample then pRec
b1b0: 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65  .    ** is large
b1c0: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
b1d0: 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  es in the array.
b1e0: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
b1f0: 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
b200: 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e    if( i>=pIdx->n
b210: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
b220: 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33  iUpper = sqlite3
b230: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
b240: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
b250: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b260: 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
b270: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
b280: 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l];.    }..    i
b290: 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
b2a0: 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
b2b0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
b2c0: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
b2d0: 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
b2e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
b2f0: 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
b300: 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
b310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b320: 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
b330: 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
b340: 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
b350: 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  ap;.    aStat[1]
b360: 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
b370: 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a  nField-1];.  }..
b380: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
b390: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
b3a0: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
b3b0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
b3c0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
b3d0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
b3e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b3f0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
b400: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
b410: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
b420: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
b430: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
b440: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
b450: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
b460: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
b470: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
b480: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
b490: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
b4a0: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
b4b0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
b4c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
b4d0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
b4e0: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
b4f0: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
b500: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
b510: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
b520: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
b530: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
b540: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
b550: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
b560: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
b570: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
b580: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
b590: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
b5a0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
b5b0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
b5c0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
b5d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
b5e0: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
b5f0: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
b600: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
b610: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
b620: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
b630: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
b640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
b650: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
b660: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
b670: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
b680: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
b690: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
b6a0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
b6b0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
b6c0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
b6d0: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
b6e0: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
b6f0: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
b700: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
b710: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
b720: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
b730: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
b740: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
b750: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
b760: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
b770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b780: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b790: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
b7a0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
b7b0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
b7c0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
b7d0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e  /.char sqlite3In
b7e0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
b7f0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  y(sqlite3 *db, I
b800: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
b810: 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28  iCol){.  assert(
b820: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
b830: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
b840: 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a  ;.  if( !pIdx->z
b850: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66  ColAff ){.    if
b860: 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  ( sqlite3IndexAf
b870: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49  finityStr(db, pI
b880: 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dx)==0 ) return 
b890: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
b8a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
b8b0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c  dx->zColAff[iCol
b8c0: 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  ];.}.#endif...#i
b8d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b8e0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
b8f0: 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
b900: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b910: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
b920: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b930: 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
b940: 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
b950: 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
b960: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
b970: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
b980: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
b990: 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
b9a0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
b9b0: 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
b9c0: 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
b9d0: 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
b9e0: 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
b9f0: 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
ba00: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
ba10: 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
ba20: 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
ba30: 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
ba40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
ba50: 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
ba60: 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
ba70: 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
ba80: 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
ba90: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
baa0: 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
bab0: 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
bac0: 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
bad0: 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
bae0: 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
baf0: 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
bb00: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
bb10: 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
bb20: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
bb30: 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
bb40: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
bb50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
bb60: 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
bb70: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
bb80: 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
bb90: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
bba0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bbb0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
bbc0: 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
bbd0: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
bbe0: 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
bbf0: 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
bc00: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
bc10: 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
bc20: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
bc30: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
bc40: 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
bc50: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
bc60: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
bc70: 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
bc80: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
bc90: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
bca0: 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
bcb0: 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
bcc0: 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
bcd0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
bce0: 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
bcf0: 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
bd00: 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
bd10: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
bd20: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
bd30: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
bd40: 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
bd50: 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
bd60: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
bd70: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
bd80: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bd90: 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
bda0: 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
bdb0: 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
bdc0: 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
bdd0: 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
bde0: 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
bdf0: 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
be00: 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
be10: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
be20: 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
be30: 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
be40: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
be50: 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
be60: 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
be70: 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
be80: 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
be90: 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
bea0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
beb0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
bec0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
bed0: 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
bee0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
bef0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
bf00: 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
bf10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bf20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bf30: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
bf40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
bf50: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
bf60: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
bf70: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
bf80: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
bf90: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
bfa0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
bfb0: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
bfc0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
bfd0: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
bfe0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
bff0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
c000: 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
c010: 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
c020: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
c030: 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
c040: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
c050: 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
c060: 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
c070: 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
c080: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
c090: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
c0a0: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
c0b0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
c0c0: 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
c0d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c0e0: 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
c0f0: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
c100: 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
c110: 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
c120: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66  LITE_OK;.  u8 af
c130: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
c140: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64  ColumnAffinity(d
c150: 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f  b, p, nEq);.  Co
c160: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
c170: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c180: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
c190: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
c1a0: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
c1b0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
c1c0: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
c1d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c1e0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
c1f0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
c200: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
c210: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
c220: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
c230: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
c240: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
c250: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
c260: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
c270: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
c280: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
c290: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
c2a0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
c2b0: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
c2c0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
c2d0: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
c2e0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
c2f0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
c300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
c310: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
c320: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
c330: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
c340: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
c350: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
c360: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
c370: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
c380: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
c390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
c3a0: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
c3b0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
c3c0: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
c3d0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
c3e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
c3f0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
c400: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
c410: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
c420: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
c430: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c440: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
c450: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
c460: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
c470: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
c480: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
c490: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
c4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c4b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c4c0: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
c4d0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
c4e0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
c4f0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
c500: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
c510: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
c520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c530: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
c540: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
c550: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
c560: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
c570: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
c580: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
c590: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
c5a0: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
c5b0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
c5c0: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
c5d0: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
c5e0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
c5f0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
c600: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
c610: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
c620: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
c630: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
c640: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
c650: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c660: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
c670: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
c680: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c690: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
c6a0: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
c6b0: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
c6c0: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
c6d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
c6e0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
c6f0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
c700: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
c710: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
c720: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
c730: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
c740: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
c750: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
c760: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
c770: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
c780: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
c790: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
c7a0: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
c7b0: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
c7c0: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
c7d0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
c800: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
c810: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
c820: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
c830: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
c840: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
c850: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
c860: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
c870: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
c880: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
c890: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
c8a0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c8b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
c8c0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
c8d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c8e0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
c8f0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
c900: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
c910: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
c920: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
c930: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
c940: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
c950: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
c960: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
c970: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
c980: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
c990: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
c9a0: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
c9b0: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
c9c0: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
c9d0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
c9e0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
c9f0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
ca00: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
ca10: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
ca20: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
ca30: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
ca40: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
ca50: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
ca80: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
caa0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
cad0: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
cae0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
caf0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
cb00: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
cb10: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
cb20: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
cb30: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
cb40: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
cb50: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
cb60: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
cb70: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
cb80: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
cb90: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
cba0: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
cbb0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
cbc0: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
cbd0: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
cbe0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
cbf0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
cc00: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
cc10: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
cc20: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
cc30: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
cc40: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
cc50: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
cc60: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
cc70: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
cc80: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
cc90: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
cca0: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
ccb0: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
ccc0: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
ccd0: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
cce0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
ccf0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
cd00: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
cd10: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
cd20: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
cd30: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
cd40: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
cd50: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
cd60: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
cd70: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
cd80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
cd90: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
cda0: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
cdb0: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
cdc0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
cdd0: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
cde0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
cdf0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
ce00: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
ce10: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
ce20: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
ce30: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
ce40: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
ce50: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
ce60: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
ce70: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
ce80: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
ce90: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
cea0: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
ceb0: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
cec0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
ced0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
cee0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
cef0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
cf00: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
cf10: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
cf20: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
cf30: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
cf40: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
cf50: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
cf60: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
cf70: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
cf80: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
cf90: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
cfa0: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
cfb0: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
cfc0: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
cfd0: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
cfe0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
cff0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
d000: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
d010: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d020: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
d030: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
d040: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
d050: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
d060: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
d070: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
d080: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
d090: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
d0a0: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
d0b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
d0c0: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
d0d0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
d0e0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
d0f0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
d100: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
d110: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
d120: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
d130: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
d140: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
d150: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d160: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
d170: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
d180: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
d190: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d1a0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
d1b0: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
d1c0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
d1d0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
d1e0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
d1f0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
d200: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
d210: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
d220: 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  ol.   && Optimiz
d230: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
d240: 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
d250: 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20  Stat34).  ){.   
d260: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
d270: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
d280: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
d290: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
d2a0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
d2b0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
d2c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d  ;.      int nBtm
d2d0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
d2e0: 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e  e.nBtm;.      in
d2f0: 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  t nTop = pLoop->
d300: 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20  u.btree.nTop;.. 
d310: 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65       /* Variable
d320: 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
d330: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
d340: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
d350: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
d360: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
d370: 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
d380: 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
d390: 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
d3a0: 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20   query. The.    
d3b0: 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64    ** lower bound
d3c0: 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61   being the conca
d3d0: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61  tenation of $P a
d3e0: 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20  nd $L, where $P 
d3f0: 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
d400: 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65  key-prefix forme
d410: 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c  d by the nEq val
d420: 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69  ues matched agai
d430: 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74  nst the nEq left
d440: 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63  -most.      ** c
d450: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
d460: 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74  dex, and $L is t
d470: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77  he value in pLow
d480: 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
d490: 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f     ** Or, if pLo
d4a0: 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24  wer is NULL or $
d4b0: 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  L cannot be extr
d4c0: 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62  acted from it (b
d4d0: 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
d4e0: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  ** is not a simp
d4f0: 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c  le variable or l
d500: 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74  iteral value), t
d510: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
d520: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  f the.      ** r
d530: 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
d540: 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
d550: 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
d560: 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
d570: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c  n.      ** if $L
d580: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77   is available, w
d590: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69  hereKeyStats() i
d5a0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74  s called for bot
d5b0: 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20  h ($P) and .    
d5c0: 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64    ** ($P:$L) and
d5d0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74   the larger of t
d5e0: 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20  he two returned 
d5f0: 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a  values is used..
d600: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
d610: 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
d620: 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
d630: 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
d640: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
d650: 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
d660: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
d670: 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
d680: 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
d690: 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
d6a0: 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  und.      ** is 
d6b0: 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
d6c0: 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
d6d0: 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
d6e0: 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
d6f0: 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ues.      ** of 
d700: 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
d710: 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
d720: 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
d730: 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
d740: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d750: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  The number of ro
d760: 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  ws between the t
d770: 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65  wo bounds is the
d780: 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c  n just iUpper-iL
d790: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ower..      */. 
d7a0: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f       tRowcnt iLo
d7b0: 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  wer;     /* Rows
d7c0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
d7d0: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
d7e0: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
d7f0: 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
d800: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
d810: 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  per bound */.   
d820: 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d     int iLwrIdx =
d830: 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -2;   /* aSampl
d840: 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65  e[] for the lowe
d850: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
d860: 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d   int iUprIdx = -
d870: 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  1;   /* aSample[
d880: 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20  ] for the upper 
d890: 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20  bound */..      
d8a0: 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20  if( pRec ){.    
d8b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
d8c0: 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69  ec->nField!=pBui
d8d0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
d8e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  );.        pRec-
d8f0: 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64  >nField = pBuild
d900: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
d910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
d920: 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72  Determine iLower
d930: 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e   and iUpper usin
d940: 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a  g ($P) only. */.
d950: 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30        if( nEq==0
d960: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
d970: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
d980: 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77  iUpper = p->nRow
d990: 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Est0;.      }els
d9a0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
d9b0: 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f  te: this call co
d9c0: 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  uld be optimized
d9d0: 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68   away - since th
d9e0: 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75  e same values mu
d9f0: 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  st .        ** h
da00: 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
da10: 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20  ed when testing 
da20: 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45  key $P in whereE
da30: 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20  qualScanEst().  
da40: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  */.        where
da50: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
da60: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
da70: 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20  .        iLower 
da80: 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
da90: 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20  iUpper = a[0] + 
daa0: 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  a[1];.      }.. 
dab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
dac0: 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65  wer==0 || (pLowe
dad0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
dae0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
daf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
db00: 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28  ( pUpper==0 || (
db10: 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
db20: 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
db30: 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))!=0 );.      a
db40: 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f  ssert( p->aSortO
db50: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
db60: 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64   if( p->aSortOrd
db70: 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20  er[nEq] ){.     
db80: 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20     /* The roles 
db90: 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  of pLower and pU
dba0: 70 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64  pper are swapped
dbb0: 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65   for a DESC inde
dbc0: 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41  x */.        SWA
dbd0: 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c  P(WhereTerm*, pL
dbe0: 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20  ower, pUpper);. 
dbf0: 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c         SWAP(int,
dc00: 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20   nBtm, nTop);.  
dc10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
dc20: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
dc30: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
dc40: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
dc50: 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
dc60: 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
dc70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78      /* Values ex
dca0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
dcb0: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
dcc0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
dcd0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
dce0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
dcf0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
dd00: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
dd10: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
dd20: 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e  r, nBtm, nEq, &n
dd30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
dd40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dd50: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n ){.          t
dd60: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
dd70: 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20         u16 mask 
dd80: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_GT|WO_LE;. 
dd90: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
dda0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
ddb0: 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61  ze(pExpr)>n ) ma
ddc0: 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c  sk = (WO_LE|WO_L
ddd0: 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c  T);.          iL
dde0: 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  wrIdx = whereKey
ddf0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
de00: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
de10: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
de20: 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e  [0] + ((pLower->
de30: 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b  eOperator & mask
de40: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
de50: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
de60: 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  w>iLower ) iLowe
de70: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
de80: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
de90: 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30        pLower = 0
dea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
deb0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
dec0: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
ded0: 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
dee0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
def0: 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
df00: 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
df10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
df40: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
df50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
df60: 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
df70: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
df80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
df90: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
dfa0: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
dfb0: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
dfc0: 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b   nTop, nEq, &n);
dfd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
dfe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
dff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
e000: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
e010: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
e020: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
e030: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
e040: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
e050: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
e060: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
e070: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72  ;.          iUpr
e080: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
e090: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
e0a0: 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20  Rec, 1, a);.    
e0b0: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
e0c0: 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f  ] + ((pUpper->eO
e0d0: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
e0e0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
e0f0: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c         if( iNew<
e100: 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20  iUpper ) iUpper 
e110: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
e120: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
e130: 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a      pUpper = 0;.
e140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e150: 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65  }..      pBuilde
e160: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
e170: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e180: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e190: 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
e1a0: 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
e1b0: 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
e1c0: 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
e1d0: 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20  iLower);.       
e1e0: 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49     /* TUNING:  I
e1f0: 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e  f both iUpper an
e200: 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72  d iLower are der
e210: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61  ived from the sa
e220: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
e230: 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73  sample, then ass
e240: 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20  ume they are 4x 
e250: 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20  more selective. 
e260: 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20   This brings.   
e270: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73         ** the es
e280: 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76  timated selectiv
e290: 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65  ity more in line
e2a0: 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f   with what it wo
e2b0: 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20  uld be.         
e2c0: 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64   ** if estimated
e2d0: 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65   without the use
e2e0: 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c   of STAT3/4 tabl
e2f0: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
e300: 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55   if( iLwrIdx==iU
e310: 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20  prIdx ) nNew -= 
e320: 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d  20;  assert( 20=
e330: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
e340: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ) );.        }el
e350: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
e360: 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
e370: 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
e380: 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
e390: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e3a0: 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
e3b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
e3c0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
e3d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
e3e0: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53  ETRACE(0x10, ("S
e3f0: 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a  TAT4 range scan:
e400: 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
e410: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e430: 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
e440: 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
e450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e460: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
e470: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
e480: 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
e490: 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
e4a0: 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
e4b0: 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
e4c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
e4d0: 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
e4e0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
e4f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e500: 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
e510: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
e520: 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72  uilder);.  asser
e530: 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
e540: 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  per );.#endif.  
e550: 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
e560: 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
e570: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
e580: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
e590: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
e5a0: 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
e5b0: 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
e5c0: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
e5d0: 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
e5e0: 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
e5f0: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
e600: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
e610: 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20  mit and neither 
e620: 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61  limit.  ** has a
e630: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65  n application-de
e640: 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64  fined likelihood
e650: 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72  (), assume the r
e660: 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64  ange is.  ** red
e670: 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74  uced by an addit
e680: 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20  ional 75%. This 
e690: 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64  means that, by d
e6a0: 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d  efault, an open-
e6b0: 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65  ended.  ** range
e6c0: 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c   query (e.g. col
e6d0: 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64   > ?) is assumed
e6e0: 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66   to match 1/4 of
e6f0: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
e700: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69  .  ** index. Whi
e710: 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67  le a closed rang
e720: 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57  e (e.g. col BETW
e730: 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20  EEN ? AND ?) is 
e740: 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a  estimated to.  *
e750: 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20  * match 1/64 of 
e760: 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20  the index. */ . 
e770: 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70   if( pLower && p
e780: 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Lower->truthProb
e790: 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20  >0 && pUpper && 
e7a0: 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f  pUpper->truthPro
e7b0: 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  b>0 ){.    nNew 
e7c0: 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f  -= 20;.  }..  nO
e7d0: 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
e7e0: 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
e7f0: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
e800: 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
e810: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
e820: 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
e830: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
e840: 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
e850: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
e860: 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
e870: 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
e880: 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
e890: 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
e8a0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e8b0: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
e8c0: 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
e8d0: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
e8e0: 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
e8f0: 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
e900: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
e910: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
e920: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
e930: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
e940: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
e950: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e960: 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
e970: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
e980: 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
e990: 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
e9a0: 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
e9b0: 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
e9c0: 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
e9d0: 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
e9e0: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
e9f0: 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
ea00: 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
ea10: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
ea20: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
ea30: 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
ea40: 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
ea50: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
ea60: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
ea70: 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
ea80: 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
ea90: 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
eaa0: 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
eab0: 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
eac0: 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
ead0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
eae0: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
eaf0: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
eb00: 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
eb10: 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
eb20: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
eb30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eb40: 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
eb50: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
eb60: 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
eb70: 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
eb80: 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
eb90: 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
eba0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
ebb0: 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
ebc0: 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
ebd0: 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
ebe0: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
ebf0: 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
ec00: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
ec10: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
ec20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
ec30: 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
ec40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ec50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
ec60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
ec70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
ec80: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
ec90: 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
eca0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
ecb0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
ecc0: 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
ecd0: 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
ece0: 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
ecf0: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
ed00: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
ed10: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
ed20: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
ed30: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
ed40: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
ed50: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
ed60: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
ed70: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
ed80: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
ed90: 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
eda0: 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72  r->pRec;.  int r
edb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
edc0: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
edd0: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
ede0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
edf0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
ee00: 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
ee10: 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
ee20: 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
ee30: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70    assert( nEq<=p
ee40: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ->nColumn );.  a
ee50: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
ee60: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
ee70: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
ee80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  ;.  assert( pBui
ee90: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
eea0: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nEq );..  /* If 
eeb0: 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61  values are not a
eec0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
eed0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69   fields of the i
eee0: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74  ndex to the left
eef0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
ef00: 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63  e, no estimate c
ef10: 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75  an be made. Retu
ef20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
ef30: 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ND. */.  if( pBu
ef40: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
ef50: 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20  <(nEq-1) ){.    
ef60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ef70: 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f  TFOUND;.  }..  /
ef80: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
ef90: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
efa0: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
efb0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
efc0: 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c  Value().  ** bel
efd0: 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  ow would return 
efe0: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20  the same value. 
eff0: 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70   */.  if( nEq>=p
f000: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
f010: 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
f020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f030: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  K;.  }..  rc = s
f040: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
f050: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
f060: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
f070: 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b  , 1, nEq-1, &bOk
f080: 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  );.  pBuilder->p
f090: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66  Rec = pRec;.  if
f0a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f0b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
f0c0: 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75  f( bOk==0 ) retu
f0d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
f0e0: 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  ND;.  pBuilder->
f0f0: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b  nRecValid = nEq;
f100: 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74  ..  whereKeyStat
f110: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
f120: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52  c, 0, a);.  WHER
f130: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71  ETRACE(0x10,("eq
f140: 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69  uality scan regi
f150: 6f 6e 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e  ons %s(%d): %d\n
f160: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f170: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20        p->zName, 
f180: 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d  nEq-1, (int)a[1]
f190: 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ));.  *pnRow = a
f1a0: 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  [1];.  .  return
f1b0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
f1c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
f1d0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
f1e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f1f0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
f200: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
f210: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
f220: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
f230: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
f240: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
f250: 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
f260: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
f270: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
f280: 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
f290: 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
f2a0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
f2b0: 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
f2c0: 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
f2d0: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
f2e0: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
f2f0: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
f300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f310: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
f320: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
f330: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
f340: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
f350: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
f360: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
f370: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
f380: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
f390: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
f3a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
f3b0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
f3c0: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
f3d0: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
f3e0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
f3f0: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
f400: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
f410: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
f420: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
f430: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
f440: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
f450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f460: 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
f470: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f480: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
f490: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
f4a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f4b0: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
f4c0: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
f4d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
f4e0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
f4f0: 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
f500: 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
f510: 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74  ,v3,...)" */.  t
f520: 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
f530: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
f540: 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
f550: 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
f560: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
f570: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
f580: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
f590: 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69  i64 nRow0 = sqli
f5a0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
f5b0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
f5c0: 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  );.  int nRecVal
f5d0: 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
f5e0: 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
f5f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
f600: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
f610: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
f620: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
f630: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
f640: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
f650: 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
f660: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
f670: 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
f680: 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
f690: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
f6a0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f6d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
f6e0: 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
f6f0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
f700: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
f710: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f720: 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77  .    nEst = nRow
f730: 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
f740: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
f750: 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
f760: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f770: 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
f780: 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
f790: 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
f7a0: 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
f7b0: 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  lid;.  }..  if( 
f7c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f7d0: 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
f7e0: 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45   > nRow0 ) nRowE
f7f0: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
f800: 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
f810: 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
f820: 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65  (0x10,("IN row e
f830: 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c  stimate: est=%d\
f840: 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
f850: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   }.  assert( pBu
f860: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
f870: 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ==nRecValid );. 
f880: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f890: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
f8a0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
f8b0: 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66  TAT4 */...#ifdef
f8c0: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
f8d0: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
f8e0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
f8f0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
f900: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
f910: 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
f920: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f930: 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20  , int iTerm){.  
f940: 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
f950: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f960: 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33  Printf("TERM-%-3
f970: 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d  d NULL\n", iTerm
f980: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f990: 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20  char zType[4];. 
f9a0: 20 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30     char zLeft[50
f9b0: 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  ];.    memcpy(zT
f9c0: 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
f9d0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
f9e0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
f9f0: 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
fa00: 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20   = 'V';.    if( 
fa10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fa20: 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a   & WO_EQUIV  ) z
fa30: 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20  Type[1] = 'E';. 
fa40: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
fa50: 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
fa60: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
fa70: 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27  ) ) zType[2] = '
fa80: 4c 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  L';.    if( pTer
fa90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
faa0: 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20  O_SINGLE ){.    
fab0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
fac0: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
fad0: 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64  ,zLeft,"left={%d
fae0: 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
fb00: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c  erm->leftCursor,
fb10: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
fb20: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
fb30: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
fb40: 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
fb50: 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70  =0 && pTerm->u.p
fb60: 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20  OrInfo!=0 ){.   
fb70: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
fb80: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74  ntf(sizeof(zLeft
fb90: 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62  ),zLeft,"indexab
fba0: 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20  le=0x%lld", .   
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72      pTerm->u.pOr
fbd0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29  Info->indexable)
fbe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fbf0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
fc00: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74  ntf(sizeof(zLeft
fc10: 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64  ),zLeft,"left=%d
fc20: 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  ", pTerm->leftCu
fc30: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
fc40: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
fc50: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52  ntf(.       "TER
fc60: 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31  M-%-3d %p %s %-1
fc70: 32 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d  2s prob=%-3d op=
fc80: 30 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30  0x%03x wtFlags=0
fc90: 78 25 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69  x%04x",.       i
fca0: 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79  Term, pTerm, zTy
fcb0: 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d  pe, zLeft, pTerm
fcc0: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
fcd0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
fce0: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
fcf0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
fd00: 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a  Term->iField ){.
fd10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
fd20: 75 67 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c  ugPrintf(" iFiel
fd30: 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e  d=%d\n", pTerm->
fd40: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c  iField);.    }el
fd50: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
fd60: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
fd70: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ");.    }.    sq
fd80: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
fd90: 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
fda0: 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
fdb0: 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
fdc0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
fdd0: 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f  *.** Show the co
fde0: 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
fdf0: 66 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a  f a WhereClause.
fe00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
fe10: 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28  hereClausePrint(
fe20: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
fe30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
fe40: 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54  r(i=0; i<pWC->nT
fe50: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77  erm; i++){.    w
fe60: 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70  hereTermPrint(&p
fe70: 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
fe80: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
fe90: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
fea0: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
feb0: 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
fec0: 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
fed0: 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
fee0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
fef0: 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
ff00: 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
ff10: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
ff20: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
ff30: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
ff40: 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
ff50: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
ff60: 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63  rc+3)/4;.  struc
ff70: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
ff80: 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
ff90: 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
ffa0: 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
ffb0: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
ffc0: 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41  ab;.  Bitmask mA
ffd0: 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29  ll = (((Bitmask)
ffe0: 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b  1)<<(nb*4)) - 1;
fff0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
10000 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a  rintf("%c%2d.%0*
10010 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
10020 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
10030 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
10040 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
10050 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
10060 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c  q & mAll);.  sql
10070 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10080 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20  " %12s",.       
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
100a0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
100b0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
100c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
100d0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
100e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
100f0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  LE)==0 ){.    co
10100 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
10110 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74  .    if( p->u.bt
10120 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a  ree.pIndex && (z
10130 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65  Name = p->u.btre
10140 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
10150 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
10160 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
10170 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
10180 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
10190 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
101a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
101b0 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
101c0 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
101d0 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
101e0 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
101f0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
10200 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10210 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22  ntf(".%-16s %2d"
10220 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
10230 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
10240 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10250 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
10260 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  20s","");.    }.
10270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
10280 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
10290 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
102a0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
102b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
102c0 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
102e0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
102f0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
10300 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
10310 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
10320 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
10330 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
10340 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
10350 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
10360 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
10370 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
10380 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
10390 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  9s", z);.    sql
103a0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
103b0 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  }.  if( p->wsFla
103c0 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
103d0 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  CAN ){.    sqlit
103e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
103f0 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70  f %05x %d-%d", p
10400 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
10410 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a  Term,p->nSkip);.
10420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
10430 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10440 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20  " f %05x N %d", 
10450 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
10460 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71  LTerm);.  }.  sq
10470 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10480 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64  (" cost %d,%d,%d
10490 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20  \n", p->rSetup, 
104a0 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
104b0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65  );.  if( p->nLTe
104c0 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68  rm && (sqlite3Wh
104d0 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
104e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
104f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10500 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b  i<p->nLTerm; i++
10510 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65  ){.      whereTe
10520 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72  rmPrint(p->aLTer
10530 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  m[i], i);.    }.
10540 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
10550 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b  .** Convert bulk
10560 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76   memory into a v
10570 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74  alid WhereLoop t
10580 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65  hat can be passe
10590 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f  d.** to whereLoo
105a0 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c  pClear harmlessl
105b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
105c0 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28  d whereLoopInit(
105d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
105e0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e   p->aLTerm = p->
105f0 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70  aLTermSpace;.  p
10600 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
10610 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61  p->nLSlot = Arra
10620 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53  ySize(p->aLTermS
10630 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c  pace);.  p->wsFl
10640 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ags = 0;.}../*.*
10650 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72  * Clear the Wher
10660 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20  eLoop.u union.  
10670 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e  Leave WhereLoop.
10680 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a  pLTerm intact..*
10690 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
106a0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
106b0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  n(sqlite3 *db, W
106c0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
106d0 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
106e0 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54   (WHERE_VIRTUALT
106f0 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f  ABLE|WHERE_AUTO_
10700 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66  INDEX) ){.    if
10710 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
10720 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
10730 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76  LE)!=0 && p->u.v
10740 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
10750 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10760 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ee(p->u.vtab.idx
10770 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  Str);.      p->u
10780 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
10790 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76   0;.      p->u.v
107a0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a  tab.idxStr = 0;.
107b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
107c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
107d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
107e0 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
107f0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
10800 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10810 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
10820 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
10830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
10840 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e  FreeNN(db, p->u.
10850 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
10860 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
10870 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
10880 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
10890 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
108a0 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
108b0 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
108c0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
108d0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
108e0 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
108f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
10900 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
10910 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
10920 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
10930 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
10940 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
10950 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
10960 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
10970 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
10980 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
10990 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
109a0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
109b0 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
109c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
109d0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
109e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
109f0 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
10a00 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
10a10 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
10a20 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
10a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10a40 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
10a50 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
10a60 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
10a70 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
10a80 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20  m[0])*n);.  if( 
10a90 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  paNew==0 ) retur
10aa0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10ab0 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  KPT;.  memcpy(pa
10ac0 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
10ad0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
10ae0 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
10af0 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
10b00 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
10b10 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
10b20 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  NN(db, p->aLTerm
10b30 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
10b40 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
10b50 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
10b60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10b70 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
10b80 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
10b90 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
10ba0 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
10bb0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
10bc0 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
10bd0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
10be0 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
10bf0 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
10c00 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
10c10 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
10c20 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
10c30 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
10c40 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
10c50 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
10c60 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
10c70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10c80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
10c90 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
10ca0 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
10cb0 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
10cc0 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
10cd0 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
10ce0 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
10cf0 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
10d00 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
10d10 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10d20 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
10d30 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
10d40 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
10d50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
10d60 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
10d70 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
10d80 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
10d90 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
10da0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
10db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
10dd0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
10de0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
10df0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
10e00 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
10e10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
10e20 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
10e30 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
10e40 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
10e50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
10e60 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
10e70 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
10e80 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
10e90 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
10ea0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
10eb0 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
10ec0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 21 3d  assert( pWInfo!=
10ed0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
10ee0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
10ef0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ; i++){.    Wher
10f00 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
10f10 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
10f20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
10f30 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65  pWLoop && (pLeve
10f40 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
10f50 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
10f60 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  LE) ){.      sql
10f70 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10f80 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
10f90 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oop);.    }.  }.
10fa0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
10fb0 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
10fc0 6f 2d 3e 73 57 43 29 3b 0a 20 20 77 68 69 6c 65  o->sWC);.  while
10fd0 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
10fe0 20 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   ){.    WhereLoo
10ff0 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
11000 4c 6f 6f 70 73 3b 0a 20 20 20 20 70 57 49 6e 66  Loops;.    pWInf
11010 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
11020 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  NextLoop;.    wh
11030 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62  ereLoopDelete(db
11040 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , p);.  }.  sqli
11050 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
11060 70 57 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pWInfo);.}../*.*
11070 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11080 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
11090 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
110a0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68  **.**   (1)  X h
110b0 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
110c0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59  ower cost that Y
110d0 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 75 73 65  .**   (2)  X use
110e0 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c  s fewer WHERE cl
110f0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
11100 59 0a 2a 2a 20 20 20 28 33 29 20 20 45 76 65 72  Y.**   (3)  Ever
11110 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
11120 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
11130 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 0a   also used by Y.
11140 2a 2a 20 20 20 28 34 29 20 20 58 20 73 6b 69 70  **   (4)  X skip
11150 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61  s at least as ma
11160 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a  ny columns as Y.
11170 2a 2a 20 20 20 28 35 29 20 20 49 66 20 58 20 69  **   (5)  If X i
11180 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
11190 65 78 2c 20 74 68 61 6e 20 59 20 69 73 20 74 6f  ex, than Y is to
111a0 6f 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f  o.**.** Conditio
111b0 6e 73 20 28 32 29 20 61 6e 64 20 28 33 29 20 6d  ns (2) and (3) m
111c0 65 61 6e 20 74 68 61 74 20 58 20 69 73 20 61 20  ean that X is a 
111d0 22 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20  "proper subset" 
111e0 6f 66 20 59 2e 0a 2a 2a 20 49 66 20 58 20 69 73  of Y..** If X is
111f0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
11200 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
11210 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
11220 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
11230 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
11240 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
11250 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
11260 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
11270 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
11280 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
11290 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
112a0 65 64 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20  ed.  Constraint 
112b0 28 34 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  (4).** was added
112c0 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
112d0 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
112e0 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
112f0 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
11300 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
11310 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
11320 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
11330 20 59 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20   Y.  Constraint 
11340 28 35 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  (5).** was added
11350 20 62 65 63 61 75 73 65 20 61 20 63 6f 76 65 72   because a cover
11360 69 6e 67 20 69 6e 64 65 78 20 70 72 6f 62 61 62  ing index probab
11370 6c 79 20 64 65 73 65 72 76 65 73 20 74 6f 20 68  ly deserves to h
11380 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
11390 0a 2a 2a 20 74 68 61 6e 20 61 20 6e 6f 6e 2d 63  .** than a non-c
113a0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 65 76  overing index ev
113b0 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72  en if it is a pr
113c0 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2f 0a  oper subset..*/.
113d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
113e0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
113f0 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74  rSubset(.  const
11400 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20   WhereLoop *pX, 
11410 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57        /* First W
11420 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70  hereLoop to comp
11430 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57  are */.  const W
11440 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20  hereLoop *pY    
11450 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61      /* Compare a
11460 67 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72  gainst this Wher
11470 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eLoop */.){.  in
11480 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58  t i, j;.  if( pX
11490 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b  ->nLTerm-pX->nSk
114a0 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d  ip >= pY->nLTerm
114b0 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20  -pY->nSkip ){.  
114c0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58    return 0; /* X
114d0 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74   is not a subset
114e0 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69   of Y */.  }.  i
114f0 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70  f( pY->nSkip > p
11500 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72  X->nSkip ) retur
11510 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72  n 0;.  if( pX->r
11520 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20  Run >= pY->rRun 
11530 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72  ){.    if( pX->r
11540 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29  Run > pY->rRun )
11550 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
11560 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
11570 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20  an Y */.    if( 
11580 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e  pX->nOut > pY->n
11590 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Out ) return 0; 
115a0 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f     /* X costs mo
115b0 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d  re than Y */.  }
115c0 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54  .  for(i=pX->nLT
115d0 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
115e0 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61  ){.    if( pX->a
115f0 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f  LTerm[i]==0 ) co
11600 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
11610 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  j=pY->nLTerm-1; 
11620 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
11630 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d    if( pY->aLTerm
11640 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b  [j]==pX->aLTerm[
11650 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
11660 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  }.    if( j<0 ) 
11670 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20  return 0;  /* X 
11680 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
11690 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69  Y since term X[i
116a0 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20  ] not used by Y 
116b0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58  */.  }.  if( (pX
116c0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
116d0 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
116e0 20 26 26 20 28 70 59 2d 3e 77 73 46 6c 61 67 73   && (pY->wsFlags
116f0 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
11700 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
11710 6e 20 30 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61  n 0;  /* Constra
11720 69 6e 74 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20  int (5) */.  }. 
11730 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
11740 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
11750 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
11760 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
11770 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
11780 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
11790 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
117a0 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
117b0 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
117c0 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
117d0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
117e0 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
117f0 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
11800 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
11810 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
11820 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
11830 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
11840 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
11850 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
11860 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
11870 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11880 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
11890 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
118a0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
118b0 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
118c0 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
118d0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
118e0 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
118f0 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
11900 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
11910 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
11920 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
11930 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
11940 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
11950 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
11960 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
11970 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
11980 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
11990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
119a0 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
119b0 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
119c0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
119d0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
119e0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
119f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11a00 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11a10 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
11a20 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11a30 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
11a40 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
11a50 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
11a60 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
11a70 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
11a80 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
11a90 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
11aa0 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
11ab0 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
11ac0 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
11ad0 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
11ae0 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
11af0 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
11b00 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
11b20 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
11b30 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
11b40 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
11b50 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
11b60 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
11b70 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
11b80 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
11b90 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
11ba0 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
11bb0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
11bc0 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
11bd0 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
11be0 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
11bf0 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
11c00 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
11c10 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
11c20 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
11c30 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
11c40 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
11c50 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
11c60 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
11c70 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
11c80 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
11c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11ca0 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
11cb0 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
11cc0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
11cd0 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
11ce0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11cf0 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
11d00 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11d10 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
11d20 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
11d30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
11d40 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
11d50 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
11d60 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
11d70 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
11d80 20 72 65 70 6c 61 63 65 64 20 62 79 20 70 54 65   replaced by pTe
11d90 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
11da0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 70 54 65  turn NULL if pTe
11db0 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20  mplate does not 
11dc0 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 57 68  belong on the Wh
11dd0 65 72 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a  ereLoop list..**
11de0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   In other words 
11df0 69 66 20 70 54 65 6d 70 6c 61 74 65 20 6f 75 67  if pTemplate oug
11e00 68 74 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  ht to be dropped
11e10 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f   from further co
11e20 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nsideration..**.
11e30 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
11e40 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
11e50 6d 70 6c 61 74 65 20 63 61 6e 20 72 65 70 6c 61  mplate can repla
11e60 63 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ce, then return 
11e70 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
11e80 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
11e90 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
11ea0 65 20 63 61 6e 6e 6f 74 20 72 65 70 6c 61 63 65  e cannot replace
11eb0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
11ec0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
11ed0 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
11ee0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
11ef0 65 20 6c 69 73 74 20 61 73 20 61 20 6e 65 77 20  e list as a new 
11f00 65 6e 74 72 79 2c 20 74 68 65 6e 20 72 65 74 75  entry, then retu
11f10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
11f20 74 68 65 0a 2a 2a 20 74 61 69 6c 20 6f 66 20 74  the.** tail of t
11f30 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
11f40 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
11f50 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11f60 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
11f70 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
11f80 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
11f90 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
11fa0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
11fb0 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
11fc0 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
11fd0 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
11fe0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
11ff0 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
12000 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
12010 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
12020 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
12030 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
12040 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
12050 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
12060 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
12070 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
12080 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
12090 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
120a0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
120b0 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
120c0 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
120d0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
120e0 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
120f0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
12100 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
12110 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
12120 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
12130 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
12140 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
12150 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
12160 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
12170 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
12180 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
12190 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
121a0 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
121b0 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
121c0 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
121d0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
121e0 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
121f0 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
12200 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
12210 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
12220 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
12230 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
12240 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
12250 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
12260 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
12270 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
12280 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
12290 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
122a0 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
122b0 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
122c0 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
122d0 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
122e0 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
122f0 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
12300 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
12310 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
12320 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
12330 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
12340 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
12350 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
12360 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
12370 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12380 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
12390 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
123a0 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
123b0 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
123c0 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
123d0 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
123e0 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
123f0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
12400 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
12410 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
12420 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
12430 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
12440 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
12450 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
12460 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
12470 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
12480 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
12490 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
124a0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
124b0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
124c0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
124d0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
124e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
124f0 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
12500 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
12510 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
12520 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
12530 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
12540 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
12550 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
12560 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
12570 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12580 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
12590 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
125a0 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
125b0 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
125c0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
125d0 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
125e0 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
125f0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
12600 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
12610 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
12620 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
12630 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
12640 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
12650 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
12660 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
12670 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
12680 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
12690 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
126a0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
126b0 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
126c0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
126d0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
126e0 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
126f0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
12700 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
12710 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
12720 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
12730 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
12740 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
12750 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
12760 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
12770 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
12780 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
12790 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
127a0 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
127b0 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
127c0 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
127d0 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
127e0 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
127f0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
12800 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
12810 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
12820 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
12830 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12840 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
12850 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
12860 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
12870 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
12880 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
128b0 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
128c0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
128f0 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
12900 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
12910 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
12920 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
12930 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
12940 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
12950 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
12960 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
12970 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
12980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12990 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
129a0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
129b0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
129c0 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
129d0 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
129e0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
129f0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
12a00 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
12a10 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
12a20 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
12a30 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
12a40 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
12a50 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
12a60 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
12a70 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
12a80 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
12a90 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
12aa0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
12ab0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
12ac0 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
12ad0 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
12ae0 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
12af0 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
12b00 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
12b10 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
12b20 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
12b30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12b40 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
12b50 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
12b60 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
12b70 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
12b80 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
12b90 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
12ba0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
12bb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
12bc0 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
12bd0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12be0 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
12bf0 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
12c00 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
12c10 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
12c20 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
12c30 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
12c40 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
12c50 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
12c60 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
12c70 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
12c80 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
12c90 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
12ca0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
12cb0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
12cc0 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
12cd0 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
12ce0 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
12cf0 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
12d00 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
12d10 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
12d20 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
12d30 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
12d40 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
12d50 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
12d60 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
12d70 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
12d80 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
12d90 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
12da0 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
12db0 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
12dc0 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
12dd0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
12de0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
12df0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
12e00 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
12e10 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
12e20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
12e30 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
12e40 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
12e50 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
12e60 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
12e70 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
12e80 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
12e90 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
12ea0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
12eb0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
12ec0 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  c;..  /* If pBui
12ed0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
12ee0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
12ef0 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
12f00 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
12f10 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
12f20 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
12f30 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
12f40 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
12f50 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
12f60 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12f70 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
12f80 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12f90 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
12fa0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
12fb0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
12fc0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
12fd0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
12fe0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
12ff0 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
13020 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
13030 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
13040 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
13050 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
13060 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
13070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13080 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
13090 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
130a0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
130b0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
130c0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
130d0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
130e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
130f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
13110 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
13120 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
13130 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
13140 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
13150 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
13160 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
13170 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
13180 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
13190 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
131a0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
131b0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
131c0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
131d0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
131e0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
131f0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
13200 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
13210 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
13220 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
13230 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
13240 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
13250 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
13260 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
13270 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
13280 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
13290 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
132a0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
132b0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
132c0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
132d0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
132e0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
132f0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
13300 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
13310 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
13320 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
13330 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
13340 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
13350 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
13360 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
13370 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
13380 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
13390 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
133a0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
133b0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
133c0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
133d0 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
133e0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
133f0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
13400 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
13410 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
13420 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
13430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
13440 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
13450 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
13460 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
13470 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
13480 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
13490 75 67 50 72 69 6e 74 66 28 22 20 20 20 77 69 74  ugPrintf("   wit
134a0 68 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  h: ");.    }else
134b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
134c0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20  ebugPrintf("    
134d0 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20  add: ");.    }. 
134e0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
134f0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
13500 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
13510 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
13520 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
13530 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
13540 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
13550 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
13560 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
13570 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
13580 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
13590 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
135a0 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
135b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
135c0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
135d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
135e0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
135f0 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
13600 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
13610 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
13620 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
13630 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
13640 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
13650 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
13660 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
13670 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
13680 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
13690 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
136a0 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
136b0 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
136c0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
136d0 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
136e0 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
136f0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
13700 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
13710 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
13720 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
13730 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
13740 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
13750 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
13760 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
13770 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
13780 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
13790 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
137a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
137b0 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
137c0 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
137d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
137e0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
137f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
13800 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
13810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
13820 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
13830 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
13840 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
13850 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
13860 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
13870 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
13880 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
13890 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
138a0 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65    }.  rc = where
138b0 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
138c0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
138d0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
138e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
138f0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
13900 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
13910 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
13920 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
13930 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
13940 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
13950 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
13960 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
13970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13980 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68  ** Adjust the Wh
13990 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c  ereLoop.nOut val
139a0 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61  ue downward to a
139b0 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73  ccount for terms
139c0 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   of the.** WHERE
139d0 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
139e0 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20  erence the loop 
139f0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
13a00 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20  t used by an.** 
13a10 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20  index..*.** For 
13a20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
13a30 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
13a40 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
13a50 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
13a60 63 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70  ch has a truth p
13a70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67  robability assig
13a80 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68  ned by one of th
13a90 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a  e likelihood(),.
13aa0 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20  ** likely(), or 
13ab0 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66  unlikely() SQL f
13ac0 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65  unctions, reduce
13ad0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
13ae0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70  umber.** of outp
13af0 75 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70  ut rows by the p
13b00 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69  robability speci
13b10 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49  fied..**.** TUNI
13b20 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57  NG:  For every W
13b30 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
13b40 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
13b50 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
13b60 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73  * and which does
13b70 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73   not have an ass
13b80 69 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62  igned truth prob
13b90 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74  ability, heurist
13ba0 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  ics.** described
13bb0 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20   below are used 
13bc0 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  to try to estima
13bd0 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f  te the truth pro
13be0 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44  bability..** TOD
13bf0 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68  O --> Perhaps th
13c00 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  is is something 
13c10 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d  that could be im
13c20 70 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72  proved by better
13c30 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73  .** table statis
13c40 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72  tics..**.** Heur
13c50 69 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61  istic 1:  Estima
13c60 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f  te the truth pro
13c70 62 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37  bability as 93.7
13c80 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a  5%.  The 93.75%.
13c90 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70  ** value corresp
13ca0 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f  onds to -1 in Lo
13cb0 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73  gEst notation, s
13cc0 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63  o this means dec
13cd0 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68  rement.** the Wh
13ce0 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65  ereLoop.nOut fie
13cf0 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63  ld for every suc
13d00 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  h WHERE clause t
13d10 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  erm..**.** Heuri
13d20 73 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72  stic 2:  If ther
13d30 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20  e exists one or 
13d40 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
13d50 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  e terms of the.*
13d60 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22  * form "x==EXPR"
13d70 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74   and EXPR is not
13d80 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72   a constant 0 or
13d90 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75   1, then make su
13da0 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20  re the.** final 
13db0 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
13dc0 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65  ate is no greate
13dd0 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68  r than 1/4 of th
13de0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a  e total number.*
13df0 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  * of rows in the
13e00 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65   table.  In othe
13e10 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20  r words, assume 
13e20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c  that x==EXPR wil
13e30 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20  l filter.** out 
13e40 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f  at least 3 out o
13e50 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58  f 4 rows.  If EX
13e60 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72  PR is -1 or 0 or
13e70 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74   1, then maybe t
13e80 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e  he.** "x" column
13e90 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65   is boolean or e
13ea0 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31  lse -1 or 0 or 1
13eb0 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66   is a common def
13ec0 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e  ault value.** on
13ed0 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20   the "x" column 
13ee0 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63  and so in that c
13ef0 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65  ase only cap the
13f00 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69   output row esti
13f10 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69  mate.** at 1/2 i
13f20 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a  nstead of 1/4..*
13f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
13f40 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
13f50 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  ust(.  WhereClau
13f60 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a  se *pWC,      /*
13f70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
13f80 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e */.  WhereLoop
13f90 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a   *pLoop,      /*
13fa0 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a   The loop to adj
13fb0 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a  ust downward */.
13fc0 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20    LogEst nRow   
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13fe0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
13ff0 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a  e entire table *
14000 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
14010 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20   *pTerm, *pX;.  
14020 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77  Bitmask notAllow
14030 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72  ed = ~(pLoop->pr
14040 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ereq|pLoop->mask
14050 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20  Self);.  int i, 
14060 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69  j, k;.  LogEst i
14070 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f  Reduce = 0;    /
14080 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68  * pLoop->nOut sh
14090 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20  ould not exceed 
140a0 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a  nRow-iReduce */.
140b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
140c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
140d0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
140e0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  0 );.  for(i=pWC
140f0 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70  ->nTerm, pTerm=p
14100 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  WC->a; i>0; i--,
14110 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
14120 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
14130 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
14140 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  L)!=0 ) break;. 
14150 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
14160 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
14170 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29  ->maskSelf)==0 )
14180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
14190 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
141a0 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65  qAll & notAllowe
141b0 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)!=0 ) continue
141c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f  ;.    for(j=pLoo
141d0 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  p->nLTerm-1; j>=
141e0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
141f0 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
14200 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
14210 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
14220 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
14230 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
14240 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61       if( pX->iPa
14250 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43  rent>=0 && (&pWC
14260 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d  ->a[pX->iParent]
14270 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  )==pTerm ) break
14280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14290 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  j<0 ){.      if(
142a0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
142b0 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b<=0 ){.        
142c0 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72  /* If a truth pr
142d0 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65  obability is spe
142e0 63 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  cified using the
142f0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69   likelihood() hi
14300 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  nts,.        ** 
14310 74 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f  then use the pro
14320 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65  bability provide
14330 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61  d by the applica
14340 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
14350 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20   pLoop->nOut += 
14360 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
14370 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14380 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
14390 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c   absence of expl
143a0 69 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61  icit truth proba
143b0 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65  bilities, use he
143c0 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20  uristics to.    
143d0 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72      ** guess a r
143e0 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20  easonable truth 
143f0 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a  probability. */.
14400 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
14410 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69  Out--;.        i
14420 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
14430 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
14440 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
14450 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
14460 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
14470 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ht;.          te
14480 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
14490 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
144a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
144b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
144c0 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b  teger(pRight, &k
144d0 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20  ) && k>=(-1) && 
144e0 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  k<=1 ){.        
144f0 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20      k = 10;.    
14500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14510 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b           k = 20;
14520 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14530 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75         if( iRedu
14540 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d  ce<k ) iReduce =
14550 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   k;.        }.  
14560 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14570 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
14580 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  t > nRow-iReduce
14590 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   )  pLoop->nOut 
145a0 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65  = nRow - iReduce
145b0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d  ;.}../* .** Term
145c0 20 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74   pTerm is a vect
145d0 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69  or range compari
145e0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  son operation. T
145f0 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69  he first compari
14600 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65  son.** in the ve
14610 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69  ctor can be opti
14620 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75  mized using colu
14630 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e  mn nEq of the in
14640 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  dex. This.** fun
14650 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
14660 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
14670 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74  f vector element
14680 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
14690 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ed.** as part of
146a0 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61   the range compa
146b0 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rison..**.** For
146c0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
146d0 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
146e0 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41     WHERE a = ? A
146f0 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28  ND (b, c, d) > (
14700 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61  ?, ?, ?).**.** a
14710 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a  nd the index:.**
14720 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
14730 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c  EX ... ON (a, b,
14740 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20   c, d, e).**.** 
14750 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
14760 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f  on would be invo
14770 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20  ked with nEq=1. 
14780 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
14790 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61  ed in.** this ca
147a0 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74  se is 3..*/.stat
147b0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
147c0 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61  eVectorLen(.  Pa
147d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
147e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
147f0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
14800 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
14810 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
14820 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  n pIdx */.  Inde
14830 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
14840 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
14850 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 69   be used for a i
14860 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
14870 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  aint */.  int nE
14880 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
14890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f  * Number of prio
148a0 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  r equality const
148b0 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69  raints on same i
148c0 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
148d0 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f  erm *pTerm     /
148e0 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65  * The vector ine
148f0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
14900 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
14910 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Cmp = sqlite3Exp
14920 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72  rVectorSize(pTer
14930 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
14940 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43  ;.  int i;..  nC
14950 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28  mp = MIN(nCmp, (
14960 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20  pIdx->nColumn - 
14970 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31  nEq));.  for(i=1
14980 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
14990 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63      /* Test if c
149a0 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70  omparison i of p
149b0 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62  Term is compatib
149c0 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28  le with column (
149d0 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f  i+nEq) .    ** o
149e0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20  f the index. If 
149f0 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f  not, exit the lo
14a00 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  op.  */.    char
14a10 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
14a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
14a30 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
14a40 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78   */.    char idx
14a50 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aff = 0;        
14a60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64        /* Indexed
14a70 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
14a80 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  y */.    CollSeq
14a90 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
14aa0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
14ab0 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ison collation s
14ac0 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45  equence */.    E
14ad0 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72  xpr *pLhs = pTer
14ae0 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  m->pExpr->pLeft-
14af0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
14b00 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
14b10 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45  pRhs = pTerm->pE
14b20 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
14b30 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
14b40 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
14b50 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20  ){.      pRhs = 
14b60 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  pRhs->x.pSelect-
14b70 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
14b80 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
14b90 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68        pRhs = pRh
14ba0 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  s->x.pList->a[i]
14bb0 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20  .pExpr;.    }.. 
14bc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
14bd0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
14be0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
14bf0 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
14c00 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72   to.    ** the r
14c10 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ight column of t
14c20 68 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20  he right source 
14c30 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20  table. And that 
14c40 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20  the sort.    ** 
14c50 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64  order of the ind
14c60 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  ex column is the
14c70 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72   same as the sor
14c80 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20  t order of the. 
14c90 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69     ** leftmost i
14ca0 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f  ndex column.  */
14cb0 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f  .    if( pLhs->o
14cc0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
14cd0 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62     || pLhs->iTab
14ce0 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c  le!=iCur .     |
14cf0 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21  | pLhs->iColumn!
14d00 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
14d10 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20  i+nEq] .     || 
14d20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
14d30 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61  [i+nEq]!=pIdx->a
14d40 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20  SortOrder[nEq]. 
14d50 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
14d60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  k;.    }..    te
14d70 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43  stcase( pLhs->iC
14d80 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20  olumn==XN_ROWID 
14d90 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  );.    aff = sql
14da0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
14db0 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65  ity(pRhs, sqlite
14dc0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
14dd0 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66  hs));.    idxaff
14de0 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
14df0 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49  olumnAffinity(pI
14e00 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73  dx->pTable, pLhs
14e10 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
14e20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20  if( aff!=idxaff 
14e30 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43  ) break;..    pC
14e40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
14e50 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
14e60 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
14e70 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70  pRhs);.    if( p
14e80 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Coll==0 ) break;
14e90 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14ea0 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
14eb0 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
14ec0 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65  ll[i+nEq]) ) bre
14ed0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
14ee0 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a   i;.}../*.** Adj
14ef0 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62  ust the cost C b
14f00 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66  y the costMult f
14f10 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f  acter T.  This o
14f20 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a  nly occurs if.**
14f30 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
14f40 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  DSQLITE_ENABLE_C
14f50 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65  OSTMULT.*/.#ifde
14f60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14f70 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e  COSTMULT.# defin
14f80 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
14f90 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d  plier(C,T)  C +=
14fa0 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   T.#else.# defin
14fb0 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
14fc0 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69  plier(C,T).#endi
14fd0 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  f../*.** We have
14fe0 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
14ff0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
15000 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
15010 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64  s of the .** ind
15020 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74  ex pIndex. Try t
15030 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
15040 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
15050 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15060 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e  lled, pBuilder->
15070 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61  pNew->nOut conta
15080 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
15090 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
150a0 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
150b0 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75  d by filtering u
150c0 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a  sing the nEq .**
150d0 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20   terms only. If 
150e0 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  it is modified, 
150f0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65  this value is re
15100 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68  stored before th
15110 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
15120 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
15130 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
15140 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
15150 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
15160 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
15170 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
15180 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
15190 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
151a0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
151b0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
151c0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
151d0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
151e0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
151f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
15200 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
15210 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
15220 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
15230 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
15240 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
15250 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
15260 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
15270 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
152a0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
152b0 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
152c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
152d0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
152e0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
152f0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
15300 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
15310 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
15320 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
15330 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15340 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
15350 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
15360 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
15370 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
15380 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
15390 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
153b0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
153c0 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
153d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
153e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15400 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
15410 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
15420 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
15450 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
15460 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
15470 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15490 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
154a0 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
154b0 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
154c0 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
154d0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
154e0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
154f0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
15500 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
15510 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
15520 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
15530 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
15540 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
15550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15560 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
15570 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15580 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
15590 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20  d_nBtm;         
155a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
155b0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
155c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
155d0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
155e0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
155f0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
15600 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
15610 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a  u.btree.nTop */.
15620 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
15630 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15640 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
15650 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
15660 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
15670 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
15680 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15690 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
156a0 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
156b0 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
156c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
156d0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
156e0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
156f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
15700 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
15710 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15720 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
15730 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
15740 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15750 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
15760 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
15770 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15790 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
157a0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
157b0 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
157c0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
157d0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
157e0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
157f0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
15800 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
15810 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
15820 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
15830 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15840 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
15850 38 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e  800, ("BEGIN %s.
15860 61 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c  addBtreeIdx(%s),
15870 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
158a0 3e 7a 4e 61 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a  >zName,pProbe->z
158b0 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74  Name, pNew->u.bt
158c0 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73  ree.nEq));..  as
158d0 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
158e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
158f0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
15900 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
15910 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15920 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
15930 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
15940 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
15950 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
15960 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
15970 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
15980 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
15990 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30  >u.btree.nBtm==0
159a0 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   );.    opMask =
159b0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
159c0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
159d0 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_LE|WO_ISNULL|W
159e0 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_IS;.  }.  if( 
159f0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
15a00 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
15a10 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
15a20 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
15a30 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
15a40 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
15a50 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61  nColumn );..  sa
15a60 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
15a70 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
15a80 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77  aved_nBtm = pNew
15a90 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a  ->u.btree.nBtm;.
15aa0 20 20 73 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70    saved_nTop = p
15ab0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
15ac0 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  p;.  saved_nSkip
15ad0 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
15ae0 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
15af0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
15b00 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
15b10 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
15b20 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
15b30 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
15b40 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
15b50 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72  ew->nOut;.  pTer
15b60 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
15b70 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
15b80 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
15b90 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71  ursor, saved_nEq
15ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15bb0 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
15bc0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65  , pProbe);.  pNe
15bd0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
15be0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
15bf0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
15c00 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
15c10 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66  tLog(rSize);.  f
15c20 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
15c30 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
15c40 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
15c50 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
15c60 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65     u16 eOp = pTe
15c70 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20  rm->eOperator;  
15c80 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
15c90 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  r pTerm->eOperat
15ca0 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74  or */.    LogEst
15cb0 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c   rCostIdx;.    L
15cc0 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75  ogEst nOutUnadju
15cd0 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  sted;        /* 
15ce0 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29  nOut before IN()
15cf0 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73   and WHERE adjus
15d00 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  tments */.    in
15d10 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65  t nIn = 0;.#ifde
15d20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15d30 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
15d40 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
15d50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
15d60 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
15d70 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f     if( (eOp==WO_
15d80 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d  ISNULL || (pTerm
15d90 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56  ->wtFlags&TERM_V
15da0 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26  NULL)!=0).     &
15db0 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  & indexColumnNot
15dc0 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76  Null(pProbe, sav
15dd0 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ed_nEq).    ){. 
15de0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
15df0 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
15e00 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
15e10 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
15e20 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
15e30 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
15e40 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
15e50 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
15e60 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
15e70 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
15e80 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
15e90 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  a LIKE optimizat
15ea0 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
15eb0 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  aint.    ** to m
15ec0 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20  ix with a lower 
15ed0 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d  range bound from
15ee0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72   some other sour
15ef0 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ce */.    if( pT
15f00 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
15f10 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70  ERM_LIKEOPT && p
15f20 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
15f30 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75  =WO_LT ) continu
15f40 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  e;..    /* Do no
15f50 74 20 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69  t allow constrai
15f60 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
15f70 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
15f80 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
15f90 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
15fa0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
15fb0 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
15fc0 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
15fd0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
15fe0 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
15ff0 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
16000 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
16010 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
16020 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
16030 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
16040 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
16050 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
16060 7d 0a 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69  }..    if( IsUni
16070 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
16080 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70   && saved_nEq==p
16090 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
160a0 20 29 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64   ){.      pBuild
160b0 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20  er->bldFlags |= 
160c0 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51  SQLITE_BLDF_UNIQ
160d0 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UE;.    }else{. 
160e0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62       pBuilder->b
160f0 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ldFlags |= SQLIT
16100 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a  E_BLDF_INDEXED;.
16110 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
16120 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
16130 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
16140 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
16150 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
16160 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
16170 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b  tm = saved_nBtm;
16180 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
16190 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f  ee.nTop = saved_
161a0 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nTop;.    pNew->
161b0 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
161c0 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
161d0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
161e0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
161f0 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
16200 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
16210 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
16220 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
16230 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
16240 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
16250 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
16260 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
16270 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
16280 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
16290 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
162a0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
162b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
162c0 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
162d0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
162e0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
162f0 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
16300 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
16310 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
16320 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
16330 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
16340 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
16350 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
16360 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
16370 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16380 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16390 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
163a0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
163b0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
163c0 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
163d0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
163e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
163f0 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   i;.        nIn 
16400 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
16410 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
16420 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  (25) );..       
16430 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
16440 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  on may actually 
16450 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28  be of the form (
16460 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54  x, y) IN (SELECT
16470 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ...)..        **
16480 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
16490 65 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74  ere is a separat
164a0 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20  e term for each 
164b0 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a  of (x) and (y)..
164c0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
164d0 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74  er, the nIn mult
164e0 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e  iplier should on
164f0 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e  ly be applied on
16500 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20  ce, not once.   
16510 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68       ** for each
16520 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20   such term. The 
16530 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63  following loop c
16540 68 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d  hecks that pTerm
16550 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   is the.        
16560 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65  ** first such te
16570 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73  rm in use, and s
16580 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20  ets nIn back to 
16590 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  0 if it is not. 
165a0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
165b0 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65  =0; i<pNew->nLTe
165c0 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rm-1; i++){.    
165d0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
165e0 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65  aLTerm[i] && pNe
165f0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45  w->aLTerm[i]->pE
16600 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e  xpr==pExpr ) nIn
16610 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
16620 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16630 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
16640 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
16650 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
16660 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
16670 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
16680 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
16690 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65      nIn = sqlite
166a0 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78  3LogEst(pExpr->x
166b0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
166c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
166d0 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53  nIn>0 );  /* RHS
166e0 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72   always has 2 or
166f0 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20   more terms...  
16700 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20  The parser.     
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
16730 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
16740 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20  "x=?". */.      
16750 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f  }.      if( pPro
16760 62 65 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a  be->hasStat1 ){.
16770 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 4d          LogEst M
16780 2c 20 6c 6f 67 4b 2c 20 73 61 66 65 74 79 4d 61  , logK, safetyMa
16790 72 67 69 6e 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rgin;.        /*
167a0 20 4c 65 74 3a 0a 20 20 20 20 20 20 20 20 2a 2a   Let:.        **
167b0 20 20 20 4e 20 3d 20 74 68 65 20 74 6f 74 61 6c     N = the total
167c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
167d0 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  in the table.   
167e0 20 20 20 20 20 2a 2a 20 20 20 4b 20 3d 20 74 68       **   K = th
167f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
16800 69 65 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ies on the RHS o
16810 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
16820 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4d  r.        **   M
16830 20 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   = the number of
16840 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
16850 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  le that match te
16860 72 6d 73 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rms to the .    
16870 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 6f 20      **       to 
16880 74 68 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20  the left in the 
16890 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 49 66 20  same index.  If 
168a0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
168b0 69 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  is on.        **
168c0 20 20 20 20 20 20 20 74 68 65 20 6c 65 66 74 2d         the left-
168d0 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d  most index colum
168e0 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20 20 20 20  n, M==N..       
168f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
16900 69 76 65 6e 20 74 68 65 20 64 65 66 69 6e 69 74  iven the definit
16910 69 6f 6e 73 20 61 62 6f 76 65 2c 20 69 74 20 69  ions above, it i
16920 73 20 62 65 74 74 65 72 20 74 6f 20 6f 6d 69 74  s better to omit
16930 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16940 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  .        ** from
16950 20 74 68 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75   the index looku
16960 70 20 61 6e 64 20 69 6e 73 74 65 61 64 20 64 6f  p and instead do
16970 20 61 20 73 63 61 6e 20 6f 66 20 74 68 65 20 4d   a scan of the M
16980 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20   elements,.     
16990 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 65 61     ** testing ea
169a0 63 68 20 73 63 61 6e 6e 65 64 20 72 6f 77 20 61  ch scanned row a
169b0 67 61 69 6e 73 74 20 74 68 65 20 49 4e 20 6f 70  gainst the IN op
169c0 65 72 61 74 6f 72 20 73 65 70 61 72 61 74 65 6c  erator separatel
169d0 79 2c 20 69 66 3a 0a 20 20 20 20 20 20 20 20 2a  y, if:.        *
169e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
169f0 20 20 20 20 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b      M*log(K) < K
16a00 2a 6c 6f 67 28 4e 29 0a 20 20 20 20 20 20 20 20  *log(N).        
16a10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 75  **.        ** Ou
16a20 72 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20  r estimates for 
16a30 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d 69 67 68  M, K, and N migh
16a40 74 20 62 65 20 69 6e 61 63 63 75 72 61 74 65 2c  t be inaccurate,
16a50 20 73 6f 20 77 65 20 62 75 69 6c 64 20 69 6e 0a   so we build in.
16a60 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 61 66          ** a saf
16a70 65 74 79 20 6d 61 72 67 69 6e 20 6f 66 20 32 20  ety margin of 2 
16a80 28 4c 6f 67 45 73 74 3a 20 31 30 29 20 74 68 61  (LogEst: 10) tha
16a90 74 20 66 61 76 6f 72 73 20 75 73 69 6e 67 20 74  t favors using t
16aa0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20  he IN operator. 
16ab0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
16ac0 68 65 20 69 6e 64 65 78 2c 20 61 73 20 75 73 69  he index, as usi
16ad0 6e 67 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  ng an index has 
16ae0 62 65 74 74 65 72 20 77 6f 72 73 74 2d 63 61 73  better worst-cas
16af0 65 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  e behavior..    
16b00 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
16b10 6e 6f 74 20 68 61 76 65 20 72 65 61 6c 20 73 71  not have real sq
16b20 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2c  lite_stat1 data,
16b30 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 74   always prefer t
16b40 6f 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  o use.        **
16b50 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
16b60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
16b70 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
16b80 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
16b90 5d 3b 0a 20 20 20 20 20 20 20 20 6c 6f 67 4b 20  ];.        logK 
16ba0 3d 20 65 73 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20  = estLog(nIn);. 
16bb0 20 20 20 20 20 20 20 73 61 66 65 74 79 4d 61 72         safetyMar
16bc0 67 69 6e 20 3d 20 31 30 3b 20 20 2f 2a 20 54 55  gin = 10;  /* TU
16bd0 4e 49 4e 47 3a 20 65 78 74 72 61 20 77 65 69 67  NING: extra weig
16be0 68 74 20 66 6f 72 20 69 6e 64 65 78 65 64 20 49  ht for indexed I
16bf0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  N */.        if(
16c00 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73 61 66 65   M + logK + safe
16c10 74 79 4d 61 72 67 69 6e 20 3c 20 6e 49 6e 20 2b  tyMargin < nIn +
16c20 20 72 4c 6f 67 53 69 7a 65 20 29 7b 0a 20 20 20   rLogSize ){.   
16c30 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
16c40 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20  E(0x40,.        
16c50 20 20 20 20 28 22 53 63 61 6e 20 70 72 65 66 65      ("Scan prefe
16c60 72 72 65 64 20 6f 76 65 72 20 49 4e 20 6f 70 65  rred over IN ope
16c70 72 61 74 6f 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20  rator on column 
16c80 25 64 20 6f 66 20 5c 22 25 73 5c 22 20 28 25 64  %d of \"%s\" (%d
16c90 3c 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  <%d)\n",.       
16ca0 20 20 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c        saved_nEq,
16cb0 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20   pProbe->zName, 
16cc0 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72  M+logK+10, nIn+r
16cd0 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  LogSize));.     
16ce0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
16cf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16d00 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
16d10 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20  CE(0x40,.       
16d20 20 20 20 20 20 28 22 49 4e 20 6f 70 65 72 61 74       ("IN operat
16d30 6f 72 20 70 72 65 66 65 72 72 65 64 20 6f 6e 20  or preferred on 
16d40 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25  column %d of \"%
16d50 73 5c 22 20 28 25 64 3e 3d 25 64 29 5c 6e 22 2c  s\" (%d>=%d)\n",
16d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61  .             sa
16d70 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d  ved_nEq, pProbe-
16d80 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31  >zName, M+logK+1
16d90 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29  0, nIn+rLogSize)
16da0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16db0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
16dc0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
16dd0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
16de0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
16df0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
16e00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
16e10 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
16e20 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
16e30 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
16e40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
16e50 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
16e60 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
16e70 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
16e80 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
16e90 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
16ea0 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
16eb0 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20  =0 && nInMul==0 
16ec0 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
16ed0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
16ee0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
16ef0 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
16f00 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62 65 2d 3e  OWID || pProbe->
16f10 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20  uniqNotNull .   
16f20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
16f30 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
16f40 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 20  pProbe->onError 
16f50 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a  && eOp==WO_EQ) .
16f60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
16f70 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16f80 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
16f90 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OW;.        }els
16fa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
16fb0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
16fc0 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a  ERE_UNQ_WANTED;.
16fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16fe0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16ff0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
17000 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
17010 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
17020 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
17030 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
17040 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
17050 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17060 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
17070 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17080 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
17090 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
170a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
170b0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
170c0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
170d0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
170e0 42 74 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65  Btm = whereRange
170f0 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20  VectorLen(.     
17100 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72       pParse, pSr
17110 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f  c->iCursor, pPro
17120 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70  be, saved_nEq, p
17130 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Term.      );.  
17140 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
17150 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
17160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
17170 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
17180 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20  M_LIKEOPT ){.   
17190 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f       /* Range co
171a0 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f  ntraints that co
171b0 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45  me from the LIKE
171c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72   optimization ar
171d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  e.        ** alw
171e0 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72  ays used in pair
171f0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  s. */.        pT
17200 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a  op = &pTerm[1];.
17210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17220 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57  (pTop-(pTerm->pW
17230 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57  C->a))<pTerm->pW
17240 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  C->nTerm );.    
17250 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
17260 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
17270 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20  _LIKEOPT );.    
17280 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
17290 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
172a0 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LT );.        if
172b0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
172c0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
172d0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
172e0 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
172f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
17300 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
17310 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20  ++] = pTop;.    
17320 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17330 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
17340 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e  IMIT;.        pN
17350 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
17360 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
17380 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
17390 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
173a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
173b0 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  p & WO_LT );.   
173c0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
173d0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
173e0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
173f0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
17400 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
17410 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65  LIMIT;.      pNe
17420 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
17430 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74  = whereRangeVect
17440 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20  orLen(.         
17450 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69   pParse, pSrc->i
17460 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20  Cursor, pProbe, 
17470 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d  saved_nEq, pTerm
17480 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
17490 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
174a0 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
174b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
174c0 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
174d0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
174e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
174f0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
17500 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
17510 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
17520 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
17530 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
17540 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
17550 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
17560 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
17570 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
17580 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
17590 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
175a0 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
175b0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
175c0 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
175d0 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
175e0 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
175f0 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
17600 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
17610 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
17620 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
17630 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
17640 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
17650 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
17660 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
17670 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
17680 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
17690 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
176a0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
176b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
176c0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
176d0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
176e0 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
176f0 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
17700 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
17710 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
17720 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
17730 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
17740 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
17750 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
17760 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
17770 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
17780 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
17790 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
177a0 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
177b0 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
177c0 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
177d0 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
177e0 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20  N|WO_IS) );..   
177f0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
17800 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
17810 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
17820 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
17830 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69  =0 && pProbe->ai
17840 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
17850 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]>=0 ){.        
17860 61 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57  assert( (eOp & W
17870 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20  O_IN) || nIn==0 
17880 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17890 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e  ase( eOp & WO_IN
178a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
178b0 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
178c0 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
178d0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
178e0 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  = nIn;.      }el
178f0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
17900 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
17910 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20  R_STAT4.        
17920 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
17930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49  ;.        if( nI
17940 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20  nMul==0 .       
17950 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
17960 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26  mple .         &
17970 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
17980 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61  nEq<=pProbe->nSa
17990 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20  mpleCol.        
179a0 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49   && ((eOp & WO_I
179b0 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61  N)==0 || !ExprHa
179c0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
179d0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
179e0 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 20  lect)).         
179f0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
17a00 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
17a10 45 5f 53 74 61 74 33 34 29 0a 20 20 20 20 20 20  E_Stat34).      
17a20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
17a30 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
17a40 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
17a50 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
17a60 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
17a70 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
17a80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17a90 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
17aa0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17ab0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
17ac0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
17ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
17ae0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
17af0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
17b00 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
17b10 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
17b20 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
17b30 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
17b40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17b50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17b60 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
17b70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
17b80 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
17b90 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
17ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
17bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
17bc0 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
17bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
17be0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17bf0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
17c00 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
17c10 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
17c20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
17c30 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
17c40 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17c50 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
17c60 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
17c70 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
17c80 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
17c90 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
17ca0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
17cb0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17cc0 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
17cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17ce0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
17cf0 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
17d00 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
17d10 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
17d20 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
17d30 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
17d40 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17d50 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
17d60 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
17d70 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
17d80 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
17d90 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
17da0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
17db0 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
17dc0 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
17dd0 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
17de0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
17df0 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
17e00 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
17e10 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
17e20 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
17e30 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
17e40 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
17e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17e60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17e70 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
17e80 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
17e90 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
17ea0 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
17eb0 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
17ec0 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
17ed0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
17ee0 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
17ef0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
17f00 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
17f10 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
17f20 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
17f30 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
17f40 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
17f50 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
17f60 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
17f70 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
17f80 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
17f90 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
17fa0 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
17fb0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
17fc0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
17fd0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17fe0 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
17ff0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
18000 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
18010 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
18020 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
18030 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
18040 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
18050 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
18060 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
18070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
18080 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
18090 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
180a0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
180b0 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
180c0 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
180d0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
180e0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
180f0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
18100 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
18110 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
18120 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
18130 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
18140 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
18150 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
18160 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
18170 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
18180 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
18190 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
181a0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
181b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
181c0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
181d0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
181e0 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
181f0 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
18200 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
18210 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
18220 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
18230 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
18240 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
18250 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
18260 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
18270 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
18280 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
18290 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
182a0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
182b0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
182c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
182d0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
182e0 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
182f0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
18300 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
18310 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
18320 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
18330 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
18340 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
18350 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
18360 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
18370 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e  d_nBtm;.  pNew->
18380 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73  u.btree.nTop = s
18390 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65  aved_nTop;.  pNe
183a0 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
183b0 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
183c0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
183d0 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
183e0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
183f0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
18400 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
18410 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
18420 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
18430 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
18440 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
18450 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
18460 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
18470 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
18480 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
18490 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
184a0 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
184b0 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
184c0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
184d0 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
184e0 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
184f0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
18500 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
18510 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
18520 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
18530 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
18540 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
18550 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
18560 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
18570 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
18580 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
18590 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
185a0 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
185b0 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
185c0 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
185d0 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
185e0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
185f0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
18600 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
18610 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
18620 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
18630 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
18640 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
18650 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
18660 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
18670 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
18680 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
18690 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
186a0 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
186b0 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
186c0 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
186d0 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
186e0 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
186f0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
18700 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
18710 4c 49 54 45 5f 53 6b 69 70 53 63 61 6e 29 0a 20  LITE_SkipScan). 
18720 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52    && pProbe->aiR
18730 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
18740 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55  Eq+1]>=42  /* TU
18750 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f  NING: Minimum fo
18760 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20  r skip-scan */. 
18770 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
18780 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
18790 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
187a0 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
187b0 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
187c0 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
187d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
187e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
187f0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
18800 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
18810 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
18820 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
18830 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
18840 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
18850 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
18860 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
18870 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
18880 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
18890 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
188a0 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55  nIter;.    /* TU
188b0 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75  NING:  Because u
188c0 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20  ncertainties in 
188d0 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f  the estimates fo
188e0 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72  r skip-scan quer
188f0 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20  ies,.    ** add 
18900 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61  a 1.375 fudge fa
18910 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69  ctor to make ski
18920 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20  p-scan slightly 
18930 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a  less likely. */.
18940 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a      nIter += 5;.
18950 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
18960 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
18970 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
18980 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75  e, nIter + nInMu
18990 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  l);.    pNew->nO
189a0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
189b0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
189c0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
189d0 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  Eq;.    pNew->nS
189e0 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
189f0 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  p;.    pNew->wsF
18a00 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
18a10 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45  lags;.  }..  WHE
18a20 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28  RETRACE(0x800, (
18a30 22 45 4e 44 20 25 73 2e 61 64 64 42 74 72 65 65  "END %s.addBtree
18a40 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c  Idx(%s), nEq=%d,
18a50 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20   rc=%d\n",.     
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
18a80 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f 62 65 2d 3e  >zName, pProbe->
18a90 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71  zName, saved_nEq
18aa0 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  , rc));.  return
18ab0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18ac0 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
18ad0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
18ae0 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
18af0 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
18b00 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
18b10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
18b20 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
18b30 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
18b40 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
18b50 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
18b60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
18b70 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
18b80 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
18b90 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
18ba0 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
18bb0 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
18bc0 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
18bd0 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
18be0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
18bf0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
18c00 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
18c10 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
18c20 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
18c30 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
18c40 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61  B;.  ExprList *a
18c50 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69  ColExpr;.  int i
18c60 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
18c70 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
18c80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
18c90 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
18ca0 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
18cb0 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
18cc0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
18cd0 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
18ce0 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
18cf0 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
18d00 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
18d10 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
18d20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
18d30 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
18d40 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
18d50 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
18d60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
18d70 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
18d80 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   1;.      for(jj
18d90 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
18da0 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
18db0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
18dc0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
18dd0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
18de0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
18df0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
18e00 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49  ( (aColExpr = pI
18e10 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21  ndex->aColExpr)!
18e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
18e30 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
18e40 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
18e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
18e60 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
18e70 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e  ]!=XN_EXPR ) con
18e80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
18e90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
18ea0 6d 70 61 72 65 53 6b 69 70 28 70 45 78 70 72 2c  mpareSkip(pExpr,
18eb0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e  aColExpr->a[jj].
18ec0 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d  pExpr,iCursor)==
18ed0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
18ee0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
18ef0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
18f00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18f10 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
18f20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
18f30 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
18f40 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
18f50 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
18f60 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
18f70 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
18f80 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
18f90 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
18fa0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18fb0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
18fc0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
18fd0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
18fe0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
18ff0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
19000 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72  rm *pTerm;.  Par
19010 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
19020 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
19030 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
19040 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
19050 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
19060 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
19070 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
19080 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
19090 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
190a0 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
190b0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  t;.  }.  if( pPa
190c0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
190d0 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
190e0 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b  SG ) pParse = 0;
190f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
19100 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
19110 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
19120 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
19130 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
19140 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
19150 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19160 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
19170 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
19180 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
19190 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71  iTab).     && sq
191a0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
191b0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
191c0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
191d0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
191e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
191f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19200 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
19210 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
19220 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
19230 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
19240 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
19250 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
19260 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
19270 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
19280 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
19290 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
192a0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
192b0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
192c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
192d0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
192e0 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
192f0 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
19300 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
19310 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
19320 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
19330 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
19340 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
19350 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
19360 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
19370 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
19380 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
19390 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
193a0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
193b0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
193c0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
193f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
19400 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
19410 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
19420 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
19430 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
19440 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
19450 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
19460 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
19470 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
19480 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
19490 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
194a0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
194b0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
194c0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
194d0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
194e0 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
194f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19500 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
19510 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
19520 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
19530 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19540 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
19550 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
19560 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
19570 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
19580 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
19590 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
195a0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
195b0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
195c0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
195d0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
195e0 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
195f0 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
19600 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
19610 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
19620 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
19630 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
19640 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
19650 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
19660 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
19670 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
19680 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
19690 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
196a0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
196b0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
196c0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
196d0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
196e0 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
196f0 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
19700 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
19710 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
19720 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
19730 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
19740 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
19750 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
19760 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
19770 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
19780 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
19790 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
197a0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
197b0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
197c0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
197d0 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
197e0 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
197f0 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
19800 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
19810 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
19820 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
19830 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
19840 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
19850 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
19860 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
19870 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
19880 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
19890 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
198a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
198b0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
198c0 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
198d0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
198e0 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
198f0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
19900 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
19910 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
19920 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
19930 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
19940 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
19950 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
19960 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
19970 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
19980 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
19990 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
199a0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
199b0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
199d0 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
199e0 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
199f0 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
19a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19a10 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
19a20 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
19a30 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
19a40 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
19a50 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
19a60 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
19a70 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
19a80 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
19a90 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
19aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
19ab0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
19ac0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
19ad0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
19ae0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
19af0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
19b00 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19b10 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
19b20 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
19b30 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
19b40 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
19b50 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
19b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
19b70 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
19b80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
19b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
19ba0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19bb0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
19bc0 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
19bd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19be0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
19bf0 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
19c00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
19c10 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
19c20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c40 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19c50 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
19c60 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
19c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19c80 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
19c90 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19ca0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
19cb0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
19cc0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
19cd0 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
19ce0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
19cf0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
19d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19d10 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
19d20 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
19d30 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
19d40 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
19d50 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
19d60 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
19d70 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
19d80 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
19d90 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
19da0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
19db0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
19dc0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
19dd0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
19de0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
19df0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
19e00 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
19e10 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
19e20 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
19e30 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
19e40 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
19e50 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
19e60 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
19e70 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
19e80 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
19e90 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
19ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19eb0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
19ec0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
19ed0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
19ee0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
19ef0 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
19f00 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
19f10 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
19f20 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
19f30 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
19f40 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
19f50 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
19f60 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
19f70 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
19f80 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
19f90 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
19fa0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
19fb0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19fd0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
19fe0 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
19ff0 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
1a000 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
1a010 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
1a020 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
1a030 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1a040 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1a050 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1a060 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1a070 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
1a080 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
1a090 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
1a0a0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
1a0b0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
1a0c0 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
1a0d0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
1a0e0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
1a0f0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
1a100 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
1a110 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
1a120 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
1a130 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
1a140 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
1a150 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
1a160 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
1a170 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
1a180 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
1a190 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
1a1a0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
1a1b0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
1a1c0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
1a1d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a1e0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
1a1f0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
1a200 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
1a210 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
1a220 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
1a230 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
1a240 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
1a250 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a260 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
1a270 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
1a280 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
1a290 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
1a2a0 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
1a2b0 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
1a2c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
1a2d0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
1a2e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1a2f0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
1a300 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
1a310 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
1a320 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
1a330 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
1a340 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
1a350 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
1a360 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1a370 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
1a380 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
1a390 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
1a3a0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1a3b0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
1a3c0 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
1a3d0 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
1a3e0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
1a3f0 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
1a400 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
1a410 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
1a420 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
1a430 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
1a440 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
1a450 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
1a460 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
1a470 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
1a480 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
1a490 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
1a4a0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
1a4b0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
1a4c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
1a4d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1a4e0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1a4f0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
1a500 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1a510 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
1a520 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
1a530 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
1a540 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
1a550 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
1a560 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
1a570 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1a580 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
1a590 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
1a5a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
1a5b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
1a5c0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
1a5d0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
1a5e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
1a5f0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
1a600 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
1a610 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1a620 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
1a630 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1a640 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
1a650 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
1a660 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
1a670 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
1a680 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
1a690 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
1a6a0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
1a6b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a6c0 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
1a6d0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
1a6e0 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
1a6f0 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
1a700 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
1a710 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
1a720 62 6c 65 73 20 6f 72 20 30 2e 35 20 28 4c 6f 67  bles or 0.5 (Log
1a730 45 73 74 3d 2d 31 30 29 20 66 6f 72 20 76 69 65  Est=-10) for vie
1a740 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
1a750 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
1a760 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
1a770 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
1a780 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
1a790 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
1a7a0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
1a7b0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
1a7c0 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
1a7d0 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
1a7e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
1a7f0 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
1a800 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
1a810 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
1a820 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
1a830 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
1a840 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
1a850 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
1a860 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
1a870 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1a880 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
1a890 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
1a8a0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
1a8b0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1a8c0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1a8d0 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
1a8e0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1a8f0 20 2b 3d 20 32 38 3b 0a 20 20 20 20 20 20 20 20   += 28;.        
1a900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a910 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2d 3d   pNew->rSetup -=
1a920 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
1a930 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74         ApplyCost
1a940 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
1a950 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63  >rSetup, pTab->c
1a960 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
1a970 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74    if( pNew->rSet
1a980 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53 65  up<0 ) pNew->rSe
1a990 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tup = 0;.       
1a9a0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68   /* TUNING: Each
1a9b0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69   index lookup yi
1a9c0 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20  elds 20 rows in 
1a9d0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
1a9e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  .        ** is m
1a9f0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75  ore than the usu
1aa00 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72  al guess of 10 r
1aa10 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61  ows, since we ha
1aa20 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20  ve no way.      
1aa30 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20    ** of knowing 
1aa40 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
1aa50 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
1aa60 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
1aa70 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
1aa80 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
1aa90 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
1aaa0 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
1aab0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
1aac0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
1aad0 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71    assert( 43==sq
1aae0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20  lite3LogEst(20) 
1aaf0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
1ab00 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
1ab10 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
1ab20 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  e,pNew->nOut);. 
1ab30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1ab40 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54  lags = WHERE_AUT
1ab50 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20  O_INDEX;.       
1ab60 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1ab70 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  mPrereq | pTerm-
1ab80 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
1ab90 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1aba0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1abb0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1abc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1abd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1abe0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
1abf0 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f  DEX */..  /* Loo
1ac00 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
1ac10 65 73 2e 20 49 66 20 74 68 65 72 65 20 77 61 73  es. If there was
1ac20 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
1ac30 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
1ac40 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20   .  ** consider 
1ac50 69 6e 64 65 78 20 70 50 72 6f 62 65 2e 20 20 2a  index pProbe.  *
1ac60 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
1ac70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
1ac80 65 3b 20 0a 20 20 20 20 20 20 70 50 72 6f 62 65  e; .      pProbe
1ac90 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  =(pSrc->pIBIndex
1aca0 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70   ? 0 : pProbe->p
1acb0 4e 65 78 74 29 2c 20 69 53 6f 72 74 49 64 78 2b  Next), iSortIdx+
1acc0 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  +.  ){.    if( p
1acd0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
1ace0 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20  here!=0.     && 
1acf0 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
1ad00 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69  ialIndex(pSrc->i
1ad10 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72  Cursor, pWC, pPr
1ad20 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
1ad30 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  re) ){.      tes
1ad40 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61  tcase( pNew->iTa
1ad50 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  b!=pSrc->iCursor
1ad60 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b   );  /* See tick
1ad70 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20  et [98d973b8f5] 
1ad80 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
1ad90 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69  e;  /* Partial i
1ada0 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61  ndex inappropria
1adb0 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  te for this quer
1adc0 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  y */.    }.    i
1add0 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f 51 75  f( pProbe->bNoQu
1ade0 65 72 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ery ) continue;.
1adf0 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f      rSize = pPro
1ae00 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
1ae10 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  0];.    pNew->u.
1ae20 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
1ae30 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
1ae40 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70  .nBtm = 0;.    p
1ae50 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
1ae60 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
1ae70 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
1ae80 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
1ae90 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
1aea0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
1aeb0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1aec0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1aed0 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20 20 20   = mPrereq;.    
1aee0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
1aef0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
1af00 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
1af10 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
1af20 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
1af30 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
1af40 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
1af50 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
1af60 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
1af70 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
1af80 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
1af90 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
1afa0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
1afb0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1afc0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
1afd0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
1afe0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
1aff0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
1b000 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
1b010 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
1b020 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
1b030 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1b040 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
1b050 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
1b060 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
1b070 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1b080 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
1b090 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
1b0a0 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
1b0b0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
1b0c0 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
1b0d0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
1b0e0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
1b0f0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1b100 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
1b110 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1b120 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
1b130 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
1b140 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
1b150 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b160 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1b170 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1b180 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
1b190 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
1b1a0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
1b1b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
1b1c0 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
1b1d0 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
1b1e0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
1b1f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b200 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
1b210 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
1b220 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
1b230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b240 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
1b250 55 73 65 64 20 26 20 70 50 72 6f 62 65 2d 3e 63  Used & pProbe->c
1b260 6f 6c 4e 6f 74 49 64 78 65 64 3b 0a 20 20 20 20  olNotIdxed;.    
1b270 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1b280 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
1b290 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
1b2a0 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
1b2b0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
1b2c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
1b2d0 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
1b2e0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
1b2f0 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
1b300 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
1b310 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50     || pProbe->pP
1b320 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
1b330 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
1b340 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
1b350 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
1b360 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
1b370 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
1b380 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
1b390 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1b3a0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1b3b0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
1b3c0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
1b3d0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
1b3e0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
1b3f0 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
1b400 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
1b410 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
1b420 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1b430 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
1b440 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
1b450 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1b460 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
1b470 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
1b480 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
1b490 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
1b4a0 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
1b4b0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
1b4c0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
1b4d0 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
1b4e0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1b4f0 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
1b500 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1b510 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
1b520 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  e rows. */.     
1b530 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1b540 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a  rSize + 1 + (15*
1b550 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
1b560 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
1b570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21  ;.        if( m!
1b580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b590 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1b5a0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
1b5b0 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20  ex scan, add in 
1b5c0 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
1b5d0 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74        ** doing t
1b5e0 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54  able lookups.  T
1b5f0 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20  he cost will be 
1b600 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  3x the number of
1b610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  .          ** lo
1b620 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74  okups.  Take int
1b630 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20  o account WHERE 
1b640 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
1b650 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  t can be.       
1b660 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20     ** satisfied 
1b670 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
1b680 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64  ndex, and that d
1b690 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  o not require a.
1b6a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1b6b0 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20  le lookup. */.  
1b6c0 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
1b6d0 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b  Lookup = rSize +
1b6e0 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f   16;  /* Base co
1b6f0 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20  st:  N*3 */.    
1b700 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1b710 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72          int iCur
1b720 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
1b730 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  ;.          Wher
1b740 65 43 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20  eClause *pWC2 = 
1b750 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
1b760 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
1b770 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d  ; ii<pWC2->nTerm
1b780 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1b790 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1b7a0 70 54 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61  pTerm = &pWC2->a
1b7b0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
1b7c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1b7d0 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
1b7e0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69  (pTerm->pExpr, i
1b7f0 43 75 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a  Cur, pProbe) ){.
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1b810 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1b820 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
1b830 2a 20 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65  * pTerm can be e
1b840 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a  valuated using j
1b850 75 73 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20  ust the index.  
1b860 53 6f 20 72 65 64 75 63 65 0a 20 20 20 20 20 20  So reduce.      
1b870 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70        ** the exp
1b880 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
1b890 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63  table lookups ac
1b8a0 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20  cordingly */.   
1b8b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
1b8c0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
1b8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b8e0 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65    nLookup += pTe
1b8f0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
1b900 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1b910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b920 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20  nLookup--;.     
1b930 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
1b940 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b950 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20  (WO_EQ|WO_IS) ) 
1b960 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20  nLookup -= 19;. 
1b970 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b990 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e     .          pN
1b9a0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
1b9b0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
1b9c0 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29  ->rRun, nLookup)
1b9d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b9e0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
1b9f0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
1ba00 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  un, pTab->costMu
1ba10 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  lt);.        whe
1ba20 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
1ba30 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
1ba40 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ize);.        rc
1ba50 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1ba60 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1ba70 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
1ba80 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
1ba90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1baa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1bab0 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c      }..    pBuil
1bac0 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20  der->bldFlags = 
1bad0 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
1bae0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
1baf0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
1bb00 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20  c, pProbe, 0);. 
1bb10 20 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d     if( pBuilder-
1bb20 3e 62 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54  >bldFlags==SQLIT
1bb30 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 20 29  E_BLDF_INDEXED )
1bb40 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20  {.      /* If a 
1bb50 6e 6f 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65 78  non-unique index
1bb60 20 69 73 20 75 73 65 64 2c 20 6f 72 20 69 66 20   is used, or if 
1bb70 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1bb80 6b 65 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  key for.      **
1bb90 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73   unique index is
1bba0 20 75 73 65 64 20 28 6d 61 6b 69 6e 67 20 74 68   used (making th
1bbb0 65 20 69 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e  e index function
1bbc0 61 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29  ally non-unique)
1bbd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
1bbe0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
1bbf0 64 61 74 61 20 62 65 63 6f 6d 65 73 20 69 6d 70  data becomes imp
1bc00 6f 72 74 61 6e 74 20 66 6f 72 20 73 63 6f 72 69  ortant for scori
1bc10 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
1bc20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54  plan */.      pT
1bc30 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
1bc40 54 46 5f 53 74 61 74 73 55 73 65 64 3b 0a 20 20  TF_StatsUsed;.  
1bc50 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1bc60 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
1bc70 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
1bc80 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
1bc90 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
1bca0 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
1bcb0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
1bcc0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
1bcd0 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ec = 0;.#endif. 
1bce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1bcf0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bd00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1bd10 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLE../*.** Argum
1bd20 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20  ent pIdxInfo is 
1bd30 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
1bd40 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74  d with all const
1bd50 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a  raints that may.
1bd60 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74 68  ** be used by th
1bd70 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1bd80 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42  identified by pB
1bd90 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
1bda0 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ab. This.** func
1bdb0 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62  tion marks a sub
1bdc0 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  set of those con
1bdd0 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c  straints usable,
1bde0 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
1bdf0 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
1be00 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 72  d and adds the r
1be10 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20  eturned plan to 
1be20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
1be30 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  A constraint is 
1be40 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66  marked usable if
1be50 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75  :.**.**   * Argu
1be60 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64  ment mUsable ind
1be70 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73 20  icates that its 
1be80 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
1be90 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64  e available, and
1bea0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73  .**.**   * It is
1beb0 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   not one of the 
1bec0 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69 66  operators specif
1bed0 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c  ied in the mExcl
1bee0 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a  ude mask passed.
1bef0 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66 6f  **     as the fo
1bf00 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77  urth argument (w
1bf10 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63 65  hich in practice
1bf20 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e   is either WO_IN
1bf30 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72   or 0)..**.** Ar
1bf40 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69  gument mPrereq i
1bf50 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c  s a mask of tabl
1bf60 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1bf70 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
1bf80 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  he.** virtual ta
1bf90 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e  ble in question.
1bfa0 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65 64   These are added
1bfb0 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72   to the plans pr
1bfc0 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62  erequisites.** b
1bfd0 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64 65  efore it is adde
1bfe0 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a  d to pBuilder..*
1bff0 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61  *.** Output para
1c000 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73  meter *pbIn is s
1c010 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  et to true if th
1c020 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20  e plan added to 
1c030 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73  pBuilder.** uses
1c040 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f   one or more WO_
1c050 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c  IN terms, or fal
1c060 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
1c070 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1c080 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1c090 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ne(.  WhereLoopB
1c0a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1c0b0 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  ,.  Bitmask mPre
1c0c0 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
1c0d0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
1c0e0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1c0f0 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69  be used. */.  Bi
1c100 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20  tmask mUsable,  
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c120 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20   Mask of usable 
1c130 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20  tables */.  u16 
1c140 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20  mExclude,       
1c150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1c160 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69  xclude terms usi
1c170 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f  ng these operato
1c180 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
1c190 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
1c1a0 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c  Info,   /* Popul
1c1b0 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20  ated object for 
1c1c0 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20  xBestIndex */.  
1c1d0 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20  u16 mNoOmit,    
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74  /* Do not omit t
1c200 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hese constraints
1c210 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20   */.  int *pbIn 
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
1c240 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20  ue if plan uses 
1c250 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f  an IN(...) op */
1c260 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  .){.  WhereClaus
1c270 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65  e *pWC = pBuilde
1c280 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74  r->pWC;.  struct
1c290 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1c2a0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
1c2b0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
1c2c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1c2d0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
1c2e0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
1c2f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
1c300 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
1c310 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  t mxTerm;.  int 
1c320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c330 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1c340 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1c350 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew;.  Parse *pPa
1c360 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  rse = pBuilder->
1c370 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1c380 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c390 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70  _item *pSrc = &p
1c3a0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
1c3b0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1c3c0 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20  w->iTab];.  int 
1c3d0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
1c3e0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
1c3f0 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  int;..  assert( 
1c400 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72  (mUsable & mPrer
1c410 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a  eq)==mPrereq );.
1c420 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70    *pbIn = 0;.  p
1c430 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
1c440 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74  rereq;..  /* Set
1c450 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
1c460 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f   on the subset o
1c470 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64  f constraints id
1c480 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a  entified by .  *
1c490 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61  * arguments mUsa
1c4a0 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65  ble and mExclude
1c4b0 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20  . */.  pIdxCons 
1c4c0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
1c4d0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1c4e0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
1c4f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
1c500 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1c510 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
1c520 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68  xCons++){.    Wh
1c530 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
1c540 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e   &pWC->a[pIdxCon
1c550 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b  s->iTermOffset];
1c560 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
1c570 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  sable = 0;.    i
1c580 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
1c590 71 52 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65  qRight & mUsable
1c5a0 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  )==pTerm->prereq
1c5b0 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20 28  Right .     && (
1c5c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c5d0 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a   & mExclude)==0.
1c5e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64      ){.      pId
1c5f0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1c600 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1c610 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1c620 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20  e output fields 
1c630 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
1c640 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
1c650 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ure */.  memset(
1c660 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
1c670 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f  f(pUsage[0])*nCo
1c680 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73  nstraint);.  ass
1c690 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ert( pIdxInfo->n
1c6a0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
1c6b0 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  =0 );.  pIdxInfo
1c6c0 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
1c6d0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
1c6e0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1c6f0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1c700 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  d = 0;.  pIdxInf
1c710 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1c720 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
1c730 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
1c740 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1c750 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
1c760 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1c770 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  ags = 0;.  pIdxI
1c780 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28  nfo->colUsed = (
1c790 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53  sqlite3_int64)pS
1c7a0 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20  rc->colUsed;..  
1c7b0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69  /* Invoke the vi
1c7c0 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73  rtual table xBes
1c7d0 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1c7e0 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65  */.  rc = vtabBe
1c7f0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
1c800 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78  pSrc->pTab, pIdx
1c810 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20  Info);.  if( rc 
1c820 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1c830 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61  mxTerm = -1;.  a
1c840 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
1c850 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
1c860 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1c870 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1c880 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  +) pNew->aLTerm[
1c890 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  i] = 0;.  pNew->
1c8a0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
1c8b0 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  = 0;.  pIdxCons 
1c8c0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
1c8d0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1c8e0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
1c8f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
1c900 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1c910 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
1c920 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e  xCons++){.    in
1c930 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  t iTerm;.    if(
1c940 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
1c950 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
1c960 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  1)>=0 ){.      W
1c970 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1c980 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1c990 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
1c9a0 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
1c9b0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
1c9c0 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  nt.       || j<0
1c9d0 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57  .       || j>=pW
1c9e0 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
1c9f0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
1ca00 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
1ca10 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73   || pIdxCons->us
1ca20 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b  able==0.      ){
1ca30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ca40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ca50 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d  "%s.xBestIndex m
1ca60 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63  alfunction",pSrc
1ca70 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1ca80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ca90 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
1caa0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a  ToFreeIdxStr );.
1cab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cac0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1cad0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1cae0 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
1caf0 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
1cb00 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1cb10 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1cb20 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
1cb30 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54  rm-1 );.      pT
1cb40 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
1cb50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
1cb60 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
1cb70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1cb80 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c    assert( iTerm<
1cb90 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
1cba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
1cbb0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
1cbc0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  m;.      if( iTe
1cbd0 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
1cbe0 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
1cbf0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1cc00 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74  m==15 );.      t
1cc10 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1cc20 31 36 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  16 );.      if( 
1cc30 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
1cc40 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
1cc50 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1cc60 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
1cc70 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1cc80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1cc90 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
1cca0 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
1ccb0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
1ccc0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
1ccd0 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
1cce0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
1ccf0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
1cd00 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
1cd10 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
1cd20 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
1cd30 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
1cd40 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
1cd50 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
1cd60 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
1cd70 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29  d.        ** (2)
1cd80 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
1cd90 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
1cda0 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
1cdb0 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
1cdc0 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
1cdd0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1cde0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1cdf0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
1ce00 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1ce10 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1ce20 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1ce30 0a 20 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d  .        *pbIn =
1ce40 20 31 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78   1; assert( (mEx
1ce50 63 6c 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d  clude & WO_IN)==
1ce60 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1ce70 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75   }.  }.  pNew->u
1ce80 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26  .vtab.omitMask &
1ce90 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70  = ~mNoOmit;..  p
1cea0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
1ceb0 54 65 72 6d 2b 31 3b 0a 20 20 66 6f 72 28 69 3d  Term+1;.  for(i=
1cec0 30 3b 20 69 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b  0; i<=mxTerm; i+
1ced0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  +){.    if( pNew
1cee0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
1cef0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  {.      /* The n
1cf00 6f 6e 2d 7a 65 72 6f 20 61 72 67 76 49 64 78 20  on-zero argvIdx 
1cf10 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 63  values must be c
1cf20 6f 6e 74 69 67 75 6f 75 73 2e 20 20 52 61 69 73  ontiguous.  Rais
1cf30 65 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  e an.      ** er
1cf40 72 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20  ror if they are 
1cf50 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  not */.      sql
1cf60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1cf70 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64  rse,"%s.xBestInd
1cf80 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  ex malfunction",
1cf90 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1cfa0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1cfb0 73 65 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  se( pIdxInfo->ne
1cfc0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1cfd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1cfe0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1cff0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1d000 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
1d010 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1d020 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1d030 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
1d040 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d  >idxNum;.  pNew-
1d050 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1d060 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
1d070 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
1d080 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1d090 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
1d0a0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1d0b0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
1d0c0 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65  o->idxStr;.  pNe
1d0d0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
1d0e0 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
1d0f0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1d100 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64  umed ?.      pId
1d110 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
1d120 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  : 0);.  pNew->rS
1d130 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1d140 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1d150 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
1d160 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1d170 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65  atedCost);.  pNe
1d180 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
1d190 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
1d1a0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
1d1b0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1d1c0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61  WHERE_ONEROW fla
1d1d0 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e  g if the xBestIn
1d1e0 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64  dex() method ind
1d1f0 69 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74  icated.  ** that
1d200 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
1d210 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65  isit at most one
1d220 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f   row. Clear it o
1d230 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69  therwise. */.  i
1d240 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  f( pIdxInfo->idx
1d250 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  Flags & SQLITE_I
1d260 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
1d270 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   ){.    pNew->ws
1d280 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
1d290 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NEROW;.  }else{.
1d2a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1d2b0 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52  s &= ~WHERE_ONER
1d2c0 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77  OW;.  }.  rc = w
1d2d0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1d2e0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1d2f0 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
1d300 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
1d310 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d320 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1d330 53 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Str);.    pNew->
1d340 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1d350 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  = 0;.  }.  WHERE
1d360 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
1d370 20 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49    bIn=%d prereqI
1d380 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f  n=%04llx prereqO
1d390 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  ut=%04llx\n",.  
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69      *pbIn, (sqli
1d3c0 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72  te3_uint64)mPrer
1d3d0 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1d3e0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1d3f0 65 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d  e3_uint64)(pNew-
1d400 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1d410 65 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eq)));..  return
1d420 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
1d430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d440 73 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 77  s invoked from w
1d450 69 74 68 69 6e 20 61 6e 20 78 42 65 73 74 49 6e  ithin an xBestIn
1d460 64 65 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20  dex() callback, 
1d470 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  it.** returns a 
1d480 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
1d490 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
1d4a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
1d4b0 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
1d4c0 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ence associated 
1d4d0 77 69 74 68 20 65 6c 65 6d 65 6e 74 20 69 43 6f  with element iCo
1d4e0 6e 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ns of the sqlite
1d4f0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f  3_index_info.aCo
1d500 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72 61  nstraint.** arra
1d510 79 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73 20  y. Or, if iCons 
1d520 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
1d530 6f 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  or there is no a
1d540 63 74 69 76 65 20 78 42 65 73 74 49 6e 64 65 78  ctive xBestIndex
1d550 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72 6e  .** call, return
1d560 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   NULL..*/.const 
1d570 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 74  char *sqlite3_vt
1d580 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c  ab_collation(sql
1d590 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1d5a0 2a 70 49 64 78 49 6e 66 6f 2c 20 69 6e 74 20 69  *pIdxInfo, int i
1d5b0 43 6f 6e 73 29 7b 0a 20 20 48 69 64 64 65 6e 49  Cons){.  HiddenI
1d5c0 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65  ndexInfo *pHidde
1d5d0 6e 20 3d 20 28 48 69 64 64 65 6e 49 6e 64 65 78  n = (HiddenIndex
1d5e0 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b  Info*)&pIdxInfo[
1d5f0 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  1];.  const char
1d600 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *zRet = 0;.  if
1d610 28 20 69 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43  ( iCons>=0 && iC
1d620 6f 6e 73 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ons<pIdxInfo->nC
1d630 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
1d640 20 43 6f 6c 6c 53 65 71 20 2a 70 43 20 3d 20 30   CollSeq *pC = 0
1d650 3b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20  ;.    int iTerm 
1d660 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
1d670 73 74 72 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69  straint[iCons].i
1d680 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
1d690 45 78 70 72 20 2a 70 58 20 3d 20 70 48 69 64 64  Expr *pX = pHidd
1d6a0 65 6e 2d 3e 70 57 43 2d 3e 61 5b 69 54 65 72 6d  en->pWC->a[iTerm
1d6b0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1d6c0 20 70 58 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pX->pLeft ){.  
1d6d0 20 20 20 20 70 43 20 3d 20 73 71 6c 69 74 65 33      pC = sqlite3
1d6e0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1d6f0 6c 53 65 71 28 70 48 69 64 64 65 6e 2d 3e 70 50  lSeq(pHidden->pP
1d700 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
1d710 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
1d720 20 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d 20 28    }.    zRet = (
1d730 70 43 20 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a  pC ? pC->zName :
1d740 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1d750 59 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Y);.  }.  return
1d760 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
1d770 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1d780 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
1d790 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1d7a0 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
1d7b0 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
1d7c0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
1d7d0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
1d7e0 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
1d7f0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
1d800 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1d810 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1d820 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20  IN joins in the 
1d830 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65  query, both mPre
1d840 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  req and.** mUnus
1d850 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
1d860 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50  0. Otherwise, mP
1d870 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1d880 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1d890 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1d8a0 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1d8b0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1d8c0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1d8d0 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1d8e0 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1d8f0 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1d900 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1d910 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1d920 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1d930 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1d940 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1d950 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1d960 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1d970 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1d980 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1d990 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1d9a0 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1d9b0 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1d9c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d9d0 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1d9e0 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1d9f0 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1da00 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1da10 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1da20 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1da30 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73  n mPrereq corres
1da40 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32  ponds to (t1, t2
1da50 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20  ) and mUnusable 
1da60 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a  to (t5, t6)..**.
1da70 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65  ** All the table
1da80 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73  s in mPrereq mus
1da90 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1daa0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1dab0 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c  virtual .** tabl
1dac0 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20  e. So any terms 
1dad0 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72  for which all pr
1dae0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1daf0 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a  satisfied by .**
1db00 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20   mPrereq may be 
1db10 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73  specified as "us
1db20 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c  able" in all cal
1db30 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1db40 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79  . .** Conversely
1db50 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  , all tables in 
1db60 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62  mUnusable must b
1db70 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1db80 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76  the current.** v
1db90 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f  irtual table, so
1dba0 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
1dbb0 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75  hich the prerequ
1dbc0 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77  isites overlap w
1dbd0 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  ith.** mUnusable
1dbe0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1dbf0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20  e configured as 
1dc00 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72  "not-usable" for
1dc10 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a   xBestIndex..*/.
1dc20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1dc30 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
1dc40 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1dc50 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
1dc60 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
1dc70 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1dc80 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dca0 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1dcb0 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1dcc0 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  re this one */. 
1dcd0 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1dce0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
1dcf0 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
1dd00 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1dd10 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29  er this one */.)
1dd20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dd30 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1dd40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1dd50 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1dd60 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
1dd70 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
1dd80 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
1dd90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ddb0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1ddc0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
1ddd0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
1dde0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1ddf0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1de00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1de10 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
1de20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1de30 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
1de40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1de50 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20  x_info *p;      
1de60 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61   /* Object to pa
1de70 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ss to xBestIndex
1de80 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e  () */.  int nCon
1de90 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1dea0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1deb0 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  f constraints in
1dec0 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b   p */.  int bIn;
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1def0 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e  plan uses IN(...
1df00 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  ) operator */.  
1df10 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1df20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74  .  Bitmask mBest
1df30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df40 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62  /* Tables used b
1df50 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  y best possible 
1df60 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e  plan */.  u16 mN
1df70 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74  oOmit;..  assert
1df80 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e  ( (mPrereq & mUn
1df90 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
1dfa0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1dfb0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
1dfc0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1dfd0 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42  arse;.  pWC = pB
1dfe0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1dff0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1e000 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
1e010 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1e020 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1e030 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
1e040 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1e050 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61   );.  p = alloca
1e060 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
1e070 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
1e080 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  le, pSrc, pBuild
1e090 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  er->pOrderBy, . 
1e0a0 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a       &mNoOmit);.
1e0b0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1e0c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e0d0 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72  _BKPT;.  pNew->r
1e0e0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
1e0f0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1e100 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1e110 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1e120 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1e130 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1e140 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
1e150 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  = p->nConstraint
1e160 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
1e170 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
1e180 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
1e190 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
1e1a0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1e1b0 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  se->db, p);.    
1e1c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e1d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
1e1e0 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78   /* First call x
1e1f0 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68  BestIndex() with
1e200 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1e210 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48   usable. */.  WH
1e220 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
1e230 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 56 69  ("BEGIN %s.addVi
1e240 72 74 75 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63  rtual()\n", pSrc
1e250 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1e260 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1e270 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e280 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e  ne: all usable\n
1e290 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  "));.  rc = wher
1e2a0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1e2b0 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ne(pBuilder, mPr
1e2c0 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30  ereq, ALLBITS, 0
1e2d0 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1e2e0 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  In);..  /* If th
1e2f0 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1e300 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1e310 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1e320 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1e330 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1e340 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1e350 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a  rce tables (IOW:
1e360 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65   a plan with mBe
1e370 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65  st==0),.  ** the
1e380 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  n there is no po
1e390 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e  int in making an
1e3a0 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  y further calls 
1e3b0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1e3c0 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79  .  ** since they
1e3d0 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e   will all return
1e3e0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1e3f0 20 28 69 66 20 74 68 65 20 78 42 65 73 74 49 6e   (if the xBestIn
1e400 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65  dex().  ** imple
1e410 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e  mentation is san
1e420 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  e). */.  if( rc=
1e430 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d  =SQLITE_OK && (m
1e440 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72  Best = (pNew->pr
1e450 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1e460 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
1e470 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1e480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e490 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1e4a0 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1e4b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1e4c0 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1e4d0 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1e4e0 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1e4f0 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1e500 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1e510 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1e520 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1e530 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1e540 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1e550 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1e560 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1e570 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1e580 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1e590 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1e5a0 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1e5b0 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1e5c0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  d. */.    if( bI
1e5d0 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  n ){.      WHERE
1e5e0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1e5f0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1e600 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22  usable w/o IN\n"
1e610 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1e620 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1e630 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1e640 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1e650 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f  eq, ALLBITS, WO_
1e660 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1e670 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  &bIn);.      ass
1e680 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20  ert( bIn==0 );. 
1e690 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d       mBestNoIn =
1e6a0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20   pNew->prereq & 
1e6b0 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ~mPrereq;.      
1e6c0 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30  if( mBestNoIn==0
1e6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1e6e0 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1e6f0 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d    seenZeroNoIN =
1e700 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1e710 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78  }..    /* Call x
1e720 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66  BestIndex once f
1e730 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74  or each distinct
1e740 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65   value of (prere
1e750 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1e760 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  q) .    ** in th
1e770 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74  e set of terms t
1e780 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65  hat apply to the
1e790 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1e7a0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
1e7b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e7c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1e7d0 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  t i;.      Bitma
1e7e0 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49  sk mNext = ALLBI
1e7f0 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  TS;.      assert
1e800 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20  ( mNext>0 );.   
1e810 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1e820 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
1e830 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1e840 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20   mThis = (.     
1e850 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d         pWC->a[p-
1e860 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
1e870 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
1e880 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1e890 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  req.        );. 
1e8a0 20 20 20 20 20 20 20 69 66 28 20 6d 54 68 69 73         if( mThis
1e8b0 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c  >mPrev && mThis<
1e8c0 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20  mNext ) mNext = 
1e8d0 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20  mThis;.      }. 
1e8e0 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65       mPrev = mNe
1e8f0 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  xt;.      if( mN
1e900 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62  ext==ALLBITS ) b
1e910 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
1e920 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20  mNext==mBest || 
1e930 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e  mNext==mBestNoIn
1e940 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e950 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e960 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e970 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78  ne: mPrev=%04llx
1e980 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22   mNext=%04llx\n"
1e990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e9a0 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1e9b0 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20  3_uint64)mPrev, 
1e9c0 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1e9d0 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72  mNext));.      r
1e9e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e9f0 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1ea00 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1ea10 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d  mPrereq, mNext|m
1ea20 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e  Prereq, 0, p, mN
1ea30 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1ea40 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72      if( pNew->pr
1ea50 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b  ereq==mPrereq ){
1ea60 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1ea70 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  o = 1;.        i
1ea80 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1ea90 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1eaa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1eab0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1eac0 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1ead0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f   in the above lo
1eae0 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  op did not find 
1eaf0 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68  a plan.    ** th
1eb00 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73  at requires no s
1eb10 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20  ource tables at 
1eb20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75  all (i.e. one gu
1eb30 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20  aranteed to be. 
1eb40 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d     ** usable), m
1eb50 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20  ake a call here 
1eb60 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20  with all source 
1eb70 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20  tables disabled 
1eb80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1eb90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1eba0 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Zero==0 ){.     
1ebb0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1ebc0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1ebd0 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e  : all disabled\n
1ebe0 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1ebf0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1ec00 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1ec10 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1ec20 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c  req, mPrereq, 0,
1ec30 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1ec40 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  n);.      if( bI
1ec50 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1ec60 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  oIN = 1;.    }..
1ec70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1ec80 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1ec90 78 28 29 20 68 61 76 65 20 73 6f 20 66 61 72 20  x() have so far 
1eca0 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1ecb0 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61   plan.    ** tha
1ecc0 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f  t requires no so
1ecd0 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61  urce tables at a
1ece0 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ll and does not 
1ecf0 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20  use an IN(...). 
1ed00 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20     ** operator, 
1ed10 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c  make a final cal
1ed20 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20  l to obtain one 
1ed30 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
1ed40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ed50 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d  && seenZeroNoIN=
1ed60 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  =0 ){.      WHER
1ed70 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1ed80 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1ed90 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f   disabled and w/
1eda0 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1edb0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1edc0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1edd0 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1ede0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1edf0 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  eq, WO_IN, p, mN
1ee00 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1ee10 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1ee20 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1ee30 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1ee40 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1ee50 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1ee60 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1ee70 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1ee80 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64  00, ("END %s.add
1ee90 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d 25 64  Virtual(), rc=%d
1eea0 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
1eeb0 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20  >zName, rc));.  
1eec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1eed0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1eee0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1eef0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1ef00 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1ef10 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1ef20 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1ef30 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1ef40 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1ef50 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1ef60 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1ef70 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1ef80 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1ef90 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1efa0 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61  Prereq, .  Bitma
1efb0 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a  sk mUnusable.){.
1efc0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1efd0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1efe0 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
1eff0 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
1f000 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1f010 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1f020 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
1f030 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f040 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
1f050 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
1f060 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
1f070 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
1f080 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
1f090 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
1f0a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f0b0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
1f0c0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1f0d0 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
1f0e0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1f0f0 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
1f100 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
1f110 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
1f120 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
1f130 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
1f140 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
1f150 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
1f160 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
1f170 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
1f180 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
1f190 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
1f1a0 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
1f1b0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1f1c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f1d0 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
1f1e0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1f1f0 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
1f200 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
1f210 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
1f220 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
1f230 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
1f240 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1f250 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1f260 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
1f270 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
1f280 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
1f290 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f2a0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
1f2b0 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1f2c0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
1f2d0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1f2e0 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
1f2f0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1f300 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1f310 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
1f320 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
1f330 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f340 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
1f350 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1f360 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1f370 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
1f380 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
1f390 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
1f3a0 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
1f3b0 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
1f3c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f3d0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1f3e0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1f3f0 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
1f400 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
1f410 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f420 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1f430 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
1f440 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f450 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
1f460 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1f470 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
1f480 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
1f490 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
1f4a0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
1f4b0 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
1f4c0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f4d0 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
1f4e0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1f4f0 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
1f500 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f510 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1f520 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f530 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
1f540 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1f550 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
1f560 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f570 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
1f580 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
1f590 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
1f5c0 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
1f5d0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
1f5e0 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
1f5f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
1f600 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
1f610 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1f620 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
1f630 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57  int(sSubBuild.pW
1f640 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  C);.        }.#e
1f650 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1f660 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1f670 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
1f680 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1f690 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1f6a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1f6b0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
1f6c0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1f6d0 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f6e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1f6f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1f700 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1f710 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1f720 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1f730 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  req);.        }.
1f740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f760 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1f770 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1f780 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1f790 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1f7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f7b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1f7c0 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1f7d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f7e0 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1f7f0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1f800 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1f810 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1f820 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1f830 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1f840 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1f850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1f860 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1f870 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f880 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1f890 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1f8a0 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1f8b0 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1f8c0 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1f8d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1f8e0 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1f8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1f900 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1f910 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1f920 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1f930 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1f940 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1f950 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f980 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1f990 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1f9a0 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f9d0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1f9e0 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1f9f0 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1fa00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1fa10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1fa30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1fa40 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1fa50 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1fa60 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1fa70 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1fa80 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1fa90 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1faa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1fab0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1fac0 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1fad0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1fae0 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1faf0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1fb00 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1fb10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1fb20 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1fb30 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1fb40 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1fb50 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1fb60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1fb70 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1fb80 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1fb90 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1fba0 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1fbb0 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1fbc0 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1fbd0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1fbe0 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1fbf0 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
1fc00 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
1fc10 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
1fc20 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
1fc30 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
1fc40 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
1fc50 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
1fc60 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
1fc70 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
1fc80 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
1fc90 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
1fca0 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
1fcb0 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
1fcc0 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
1fcd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
1fce0 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
1fcf0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1fd00 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
1fd10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
1fd20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1fd30 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
1fd40 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
1fd50 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
1fd60 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
1fd70 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
1fd80 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
1fd90 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
1fda0 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
1fdb0 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
1fdc0 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
1fdd0 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
1fde0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
1fdf0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
1fe00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1fe10 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
1fe20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
1fe30 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
1fe40 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
1fe50 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1fe60 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1fe70 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1fe80 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
1fe90 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
1fea0 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
1feb0 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1fec0 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
1fed0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1fee0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1fef0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1ff00 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
1ff10 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1ff20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
1ff30 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1ff40 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
1ff50 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1ff60 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1ff70 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
1ff80 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69  Prereq = 0;.  Bi
1ff90 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
1ffa0 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
1ffb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1ffc0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
1ffd0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1ffe0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1fff0 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
20000 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
20010 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
20020 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
20030 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20040 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
20050 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
20060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
20070 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
20080 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
20090 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
200a0 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
200b0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
200c0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
200d0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
200e0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
200f0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
20100 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
20110 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
20120 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20  >a; pItem<pEnd; 
20130 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
20140 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55  {.    Bitmask mU
20150 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  nusable = 0;.   
20160 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
20170 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
20180 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
20190 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
201a0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
201b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
201c0 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
201d0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72  ->fg.jointype|pr
201e0 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28  iorJointype) & (
201f0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
20200 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))!=0 ){.      /
20210 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  * This condition
20220 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49   is true when pI
20230 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20  tem is the FROM 
20240 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74  clause term on t
20250 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68  he.      ** righ
20260 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61  t-hand-side of a
20270 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
20280 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d  OIN.  */.      m
20290 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b  Prereq = mPrior;
202a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
202b0 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d  Jointype = pItem
202c0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23  ->fg.jointype;.#
202d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
202e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
202f0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
20300 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
20310 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
20320 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a  rcList_item *p;.
20330 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74        for(p=&pIt
20340 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  em[1]; p<pEnd; p
20350 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
20360 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70   mUnusable || (p
20370 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
20380 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
20390 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  S)) ){.         
203a0 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71   mUnusable |= sq
203b0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
203c0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
203d0 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29  Set, p->iCursor)
203e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
203f0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77    }.      rc = w
20400 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
20410 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  al(pBuilder, mPr
20420 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
20430 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
20440 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
20450 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
20460 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  /.    {.      rc
20470 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
20480 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
20490 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20  Prereq);.    }. 
204a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
204b0 45 5f 4f 4b 20 26 26 20 70 42 75 69 6c 64 65 72  E_OK && pBuilder
204c0 2d 3e 70 57 43 2d 3e 68 61 73 4f 72 20 29 7b 0a  ->pWC->hasOr ){.
204d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
204e0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
204f0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  er, mPrereq, mUn
20500 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  usable);.    }. 
20510 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
20520 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
20530 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
20540 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
20550 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72  eak;.  }..  wher
20560 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
20570 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
20580 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
20590 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
205a0 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
205b0 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
205c0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
205d0 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   6th.** paramete
205e0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
205f0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
20600 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
20610 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
20620 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
20630 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
20640 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
20650 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
20660 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
20670 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
20680 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20690 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
206a0 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
206b0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
206c0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
206d0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
206e0 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
206f0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
20700 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
20710 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
20720 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
20730 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
20740 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
20750 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
20760 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
20770 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
20780 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20790 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
207a0 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
207b0 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
207c0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
207d0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
207e0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
207f0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
20800 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
20810 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
20820 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
20830 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
20840 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
20850 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
20860 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
20870 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
20880 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20890 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
208a0 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
208b0 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
208c0 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
208d0 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
208e0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
208f0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
20900 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
20910 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
20920 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
20930 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
20940 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
20950 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
20960 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
20970 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
20980 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
20990 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
209a0 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
209b0 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
209c0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
209d0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
209e0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
209f0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
20a00 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
20a10 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
20a20 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59  Y or _DISTINCTBY
20a30 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d   or _ORDERBY_LIM
20a40 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  IT */.  u16 nLoo
20a50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
20a60 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
20a70 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
20a80 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
20a90 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
20aa0 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
20ab0 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
20ac0 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
20ad0 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
20ae0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
20af0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
20b00 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
20b10 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
20b20 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
20b30 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
20b40 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
20b50 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
20b60 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
20b70 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
20b80 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
20b90 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
20ba0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
20bb0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
20bc0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
20bd0 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
20be0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
20bf0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
20c00 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
20c10 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
20c20 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
20c30 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
20c40 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
20c50 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
20c60 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
20c70 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
20c80 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20c90 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65  lause */.  u16 e
20ca0 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  qOpMask;        
20cb0 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61   /* Allowed equa
20cc0 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
20cd0 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
20ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20cf0 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
20d00 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
20d10 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
20d20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
20d30 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
20d40 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
20d50 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
20d60 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
20d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
20d80 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
20d90 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
20da0 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
20db0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
20dc0 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
20dd0 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
20de0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
20df0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
20e00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
20e10 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
20e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
20e30 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
20e40 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
20e50 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
20e60 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
20e70 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
20e80 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
20e90 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
20ea0 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
20eb0 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
20ec0 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
20ed0 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
20ee0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
20ef0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
20f00 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
20f10 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
20f20 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
20f30 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
20f40 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
20f50 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
20f60 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
20f70 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
20f80 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
20f90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
20fa0 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
20fb0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
20fc0 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
20fd0 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
20fe0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
20ff0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
21000 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
21010 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21020 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
21030 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
21040 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
21050 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
21060 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
21070 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
21080 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
21090 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
210a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
210b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
210c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
210d0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
210e0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
210f0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
21100 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
21110 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
21120 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
21130 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
21140 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
21150 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
21160 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
21170 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
21180 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
21190 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
211a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
211b0 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
211c0 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
211d0 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
211e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
211f0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
21200 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
21210 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
21220 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
21230 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
21240 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
21250 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
21260 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
21270 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
21280 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
21290 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
212a0 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
212b0 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
212c0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
212d0 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
212e0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
212f0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
21300 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
21310 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
21320 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
21330 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
21340 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
21350 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
21360 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
21370 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
21380 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
21390 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
213a0 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
213b0 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
213c0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
213d0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
213e0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
213f0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
21400 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
21410 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
21420 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
21430 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
21440 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
21450 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
21460 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
21470 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
21480 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
21490 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
214a0 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
214b0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
214c0 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
214d0 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
214e0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
214f0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
21500 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
21510 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
21520 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
21530 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
21540 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
21550 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
21560 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
21570 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
21580 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
21590 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
215a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
215b0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
215c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
215d0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
215e0 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
215f0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
21600 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
21610 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
21620 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
21630 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
21640 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
21650 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
21660 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
21670 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
21680 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
21690 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
216a0 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
216b0 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
216c0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
216d0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
216e0 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
216f0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
21700 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
21710 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20  0;.  eqOpMask = 
21720 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20  WO_EQ | WO_IS | 
21730 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28  WO_ISNULL;.  if(
21740 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21750 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21760 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20  T ) eqOpMask |= 
21770 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f  WO_IN;.  for(iLo
21780 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
21790 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
217a0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
217b0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
217c0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
217d0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
217e0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
217f0 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70   if( iLoop<nLoop
21800 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20   ){.      pLoop 
21810 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
21820 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28  Loop];.      if(
21830 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21840 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21850 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
21860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21870 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Loop = pLast;.  
21880 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
21890 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
218a0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
218b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
218c0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
218d0 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
218e0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
218f0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
21900 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
21910 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b  ree.nIdxCol = 0;
21920 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
21930 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
21940 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
21950 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
21960 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
21970 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
21980 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
21990 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
219a0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
219b0 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
219c0 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
219d0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
219e0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
219f0 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
21a00 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
21a10 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
21a20 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
21a30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
21a40 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
21a50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21a60 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21a70 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
21a80 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
21a90 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
21aa0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
21ab0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21ac0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21ad0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
21ae0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21af0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
21b00 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
21b10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
21b20 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
21b30 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  reFindTerm(&pWIn
21b40 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
21b50 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
21b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b70 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
21b80 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20  eqOpMask, 0);.  
21b90 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
21ba0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21bb0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
21bc0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
21bd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  {.        /* IN 
21be0 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76  terms are only v
21bf0 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  alid for sorting
21c00 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
21c10 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20   LIMIT .        
21c20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
21c30 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69   and then only i
21c40 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75 61  f they are actua
21c50 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20 20  lly used.       
21c60 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72 79   ** by the query
21c70 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   plan */.       
21c80 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
21c90 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
21ca0 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  RBY_LIMIT );.   
21cb0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
21cc0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  pLoop->nLTerm &&
21cd0 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61   pTerm!=pLoop->a
21ce0 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d  LTerm[j]; j++){}
21cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  .        if( j>=
21d00 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20  pLoop->nLTerm ) 
21d10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21d20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  }.      if( (pTe
21d30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
21d40 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
21d50 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
21d60 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
21d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
21d80 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70 57  rCollSeqMatch(pW
21d90 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a 20  Info->pParse, . 
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21dc0 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70 45  pExpr, pTerm->pE
21dd0 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)==0 ){.     
21de0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21e00 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21e10 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
21e20 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
21e30 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
21e40 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
21e50 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
21e60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21e70 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
21e80 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
21e90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
21ea0 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
21eb0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
21ec0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
21ed0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
21ee0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
21ef0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
21f00 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
21f10 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
21f20 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
21f30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21f40 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
21f50 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
21f60 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
21f70 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
21f80 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
21f90 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
21fa0 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
21fb0 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
21fc0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
21fd0 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
21fe0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
21ff0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
22000 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20  n-1]==XN_ROWID. 
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73           || !Has
22030 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
22040 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
22050 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22060 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
22070 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
22080 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
22090 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
220a0 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
220b0 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
220c0 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
220d0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
220e0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
220f0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
22100 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
22110 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
22120 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
22130 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
22140 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
22150 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
22160 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65  nce = 1; /* True
22170 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
22180 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
22190 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73   */..        ass
221a0 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75  ert( j>=pLoop->u
221b0 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20  .btree.nEq .    
221c0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
221d0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29  p->aLTerm[j]==0)
221e0 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ==(j<pLoop->nSki
221f0 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  p).        );.  
22200 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
22210 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26  p->u.btree.nEq &
22220 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  & j>=pLoop->nSki
22230 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
22240 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  16 eOp = pLoop->
22250 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
22260 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  ator;..         
22270 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
22280 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55   and IS and ISNU
22290 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f  LL terms.  (Also
222a0 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77   skip IN terms w
222b0 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
222c0 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44   doing WHERE_ORD
222d0 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65  ERBY_LIMIT proce
222e0 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20  ssing). .       
222f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
22300 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
22310 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75  t term is a colu
22320 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20  mn of an ((?,?) 
22330 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20  IN (SELECT...)) 
22340 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
22350 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69  pression for whi
22360 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ch the SELECT re
22370 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
22380 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20  one column,.    
22390 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74        ** check t
223a0 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e  hat it is the on
223b0 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62  ly column used b
223c0 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68  y this loop. Oth
223d0 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
223e0 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e    ** if it is on
223f0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
22400 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  , none of the co
22410 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20  lumns can be.   
22420 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64         ** consid
22430 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e  ered to match an
22440 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20   ORDER BY term. 
22450 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22460 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73  ( (eOp & eqOpMas
22470 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
22480 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
22490 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
224a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
224b0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
224c0 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
224d0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
224e0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
224f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22500 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
22510 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
22520 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26  if( ALWAYS(eOp &
22530 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20   WO_IN) ){.     
22540 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53         /* ALWAYS
22550 28 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  () justification
22560 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61  : eOp is an equa
22570 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75  lity operator du
22580 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
22590 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d       ** j<pLoop-
225a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e  >u.btree.nEq con
225b0 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20  straint above.  
225c0 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68  Any equality oth
225d0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
225e0 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20  * than WO_IN is 
225f0 63 61 70 74 75 72 65 64 20 62 79 20 74 68 65 20  captured by the 
22600 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20  previous "if".  
22610 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20  So this one.    
22620 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
22630 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49  s has to be WO_I
22640 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  N. */.          
22650 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f    Expr *pX = pLo
22660 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70  op->aLTerm[j]->p
22670 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22680 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70    for(i=j+1; i<p
22690 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
226a0 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; i++){.       
226b0 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70         if( pLoop
226c0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
226d0 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20  pr==pX ){.      
226e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
226f0 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ( (pLoop->aLTerm
22700 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  [i]->eOperator &
22710 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20   WO_IN) );.     
22720 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65             bOnce
22730 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22780 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
22790 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
227a0 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
227b0 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
227c0 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
227d0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
227e0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
227f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
22800 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22810 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
22820 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
22830 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
22840 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
22850 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
22860 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
22870 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
22880 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
22890 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
228a0 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52  ) iColumn = XN_R
228b0 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  OWID;.        }e
228c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
228d0 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
228e0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  D;.          rev
228f0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
22900 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
22910 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
22920 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
22930 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
22940 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
22950 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
22960 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
22970 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
22980 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
22990 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
229a0 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
229b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
229c0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
229d0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
229e0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
229f0 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
22a00 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
22a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
22a20 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
22a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
22a40 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
22a50 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
22a60 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
22a70 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
22a80 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
22a90 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d   the index and m
22aa0 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
22ab0 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
22ac0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
22ad0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
22ae0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
22af0 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
22b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
22b10 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
22b20 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
22b30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
22b40 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
22b50 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
22b60 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
22b70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
22b80 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
22b90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
22ba0 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
22bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
22bc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22bd0 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
22be0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
22bf0 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
22c00 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
22c10 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
22c20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
22c30 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
22c40 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20  n>=XN_ROWID ){. 
22c50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22c60 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
22c70 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
22c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22c90 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
22ca0 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
22cb0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
22cc0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
22cd0 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
22ce0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d00 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 49 64         Expr *pId
22d10 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  xExpr = pIndex->
22d20 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
22d30 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22d40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22d50 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 4f 42  rCompareSkip(pOB
22d60 45 78 70 72 2c 20 70 49 64 78 45 78 70 72 2c 20  Expr, pIdxExpr, 
22d70 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
22d80 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
22d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22da0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22db0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
22dc0 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  !=XN_ROWID ){.  
22dd0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
22de0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
22df0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
22e00 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
22e10 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
22e20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
22e30 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
22e40 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
22e50 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
22e60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22e80 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
22e90 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b  e.nIdxCol = j+1;
22ea0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
22eb0 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
22ec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22ed0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
22ee0 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c  sMatch && (wctrl
22ef0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
22f00 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
22f10 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
22f20 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
22f30 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
22f40 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
22f50 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
22f60 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
22f70 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
22f80 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
22f90 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
22fa0 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22fc0 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
22fd0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
22fe0 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
22ff0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
23000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23010 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
23020 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
23030 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
23040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
23050 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
23060 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
23070 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
23080 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
23090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
230a0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
230b0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
230c0 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  if( iColumn==XN_
230d0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
230e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
230f0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
23100 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
23110 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
23120 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23130 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
23140 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
23150 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
23170 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
23180 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
23190 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
231a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
231b0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
231c0 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
231d0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
231e0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
231f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23210 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
23220 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
23230 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
23240 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
23250 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
23260 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23270 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
23280 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
23290 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
232a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
232b0 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
232c0 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
232d0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
232e0 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
232f0 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
23300 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
23310 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
23320 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
23330 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
23340 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
23350 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
23360 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
23370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
23380 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
23390 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
233a0 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
233b0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
233c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
233d0 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
233e0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
233f0 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69      mTerm = sqli
23400 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
23410 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
23420 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
23430 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
23440 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
23450 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
23460 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23470 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
23480 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
23490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
234a0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
234b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
234c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
234d0 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
234e0 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
234f0 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
23500 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
23510 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
23520 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
23530 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
23540 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
23550 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
23560 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
23570 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
23580 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
23590 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
235a0 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
235b0 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
235c0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
235d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
235e0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
235f0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
23600 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
23610 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
23620 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
23630 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
23640 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
23650 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
23660 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
23670 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
23680 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
23690 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
236a0 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
236b0 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
236c0 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
236d0 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
236e0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
236f0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
23700 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
23710 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
23720 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
23730 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
23740 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
23750 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
23760 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
23770 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
23780 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
23790 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
237a0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
237b0 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
237c0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
237d0 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
237e0 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
237f0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23800 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
23810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
23820 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
23830 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
23840 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
23850 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
23860 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
23870 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
23880 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
23890 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
238a0 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
238b0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
238c0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
238d0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
238e0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
238f0 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
23900 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
23910 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
23920 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
23930 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
23940 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
23950 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
23960 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
23970 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
23980 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
23990 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
239a0 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
239b0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
239c0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
239d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
239e0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
239f0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
23a00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23a10 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
23a20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
23a30 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
23a40 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
23a50 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
23a60 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
23a70 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23a80 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
23a90 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
23aa0 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
23ab0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
23ac0 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
23ad0 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
23ae0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23af0 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
23b00 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
23b10 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
23b20 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
23b30 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
23b40 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
23b50 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
23b60 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
23b70 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
23b80 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
23b90 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
23ba0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
23bb0 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
23bc0 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
23bd0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
23be0 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
23bf0 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
23c00 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
23c10 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
23c20 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
23c30 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
23c40 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
23c50 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
23c60 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
23c70 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
23c80 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
23c90 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
23ca0 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
23cb0 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
23cc0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
23cd0 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
23ce0 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
23cf0 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
23d00 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
23d10 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
23d20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
23d30 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
23d40 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
23d50 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
23d60 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
23d70 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
23d80 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
23d90 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
23da0 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
23db0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
23dc0 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
23dd0 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
23de0 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
23df0 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
23e00 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
23e10 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
23e20 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
23e30 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
23e40 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
23e50 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
23e60 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
23e70 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
23e80 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
23e90 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
23ea0 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
23eb0 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
23ec0 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  w + rScale + 16;
23ed0 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20  ..  /* Multiple 
23ee0 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20  by log(M) where 
23ef0 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  M is the number 
23f00 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a  of output rows..
23f10 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d    ** Use the LIM
23f20 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69  IT for M if it i
23f30 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  s smaller */.  i
23f40 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
23f50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
23f60 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20  SE_LIMIT)!=0 && 
23f70 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e  pWInfo->iLimit<n
23f80 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20  Row ){.    nRow 
23f90 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  = pWInfo->iLimit
23fa0 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73  ;.  }.  rSortCos
23fb0 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77  t += estLog(nRow
23fc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72  );.  return rSor
23fd0 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tCost;.}../*.** 
23fe0 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
23ff0 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
24000 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
24010 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
24020 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
24030 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
24040 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
24050 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
24060 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
24070 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
24080 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
24090 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
240a0 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
240b0 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
240c0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
240d0 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
240e0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
240f0 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
24100 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
24110 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
24120 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
24130 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
24140 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
24150 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
24160 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
24170 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
24180 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
24190 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
241a0 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
241b0 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
241c0 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
241d0 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
241e0 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
241f0 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
24200 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
24210 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
24220 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
24230 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
24240 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
24250 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
24260 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24270 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
24280 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
24290 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
242a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
242b0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
242c0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
242d0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
242e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
242f0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24310 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
24320 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
24330 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
24340 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
24350 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
24360 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
24370 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
24380 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24390 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
243a0 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  o replace */.  i
243b0 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
243c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
243d0 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63  er of ORDER BY c
243e0 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  lause terms */. 
243f0 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
24400 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
24410 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
24420 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
24430 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72    LogEst mxUnsor
24440 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  ted = 0;    /* M
24450 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20  aximum unsorted 
24460 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
24470 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
24480 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
24490 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
244a0 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
244b0 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
244c0 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
244d0 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
244e0 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
244f0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
24500 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
24510 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
24520 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
24530 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
24540 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
24550 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
24560 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
24570 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
24580 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
24590 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
245a0 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
245b0 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
245c0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
245d0 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
245e0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
245f0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
24600 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
24610 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
24620 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24630 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
24640 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
24650 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
24660 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
24670 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  emory */.  LogEs
24680 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30  t *aSortCost = 0
24690 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20  ;    /* Sorting 
246a0 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74  and partial sort
246b0 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63  ing costs */.  c
246c0 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
246d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
246e0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
246f0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
24700 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
24710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24720 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
24730 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  ce allocated at 
24740 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61  pSpace */..  pPa
24750 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
24760 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
24770 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
24780 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
24790 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
247a0 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
247b0 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
247c0 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
247d0 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
247e0 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
247f0 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
24800 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
24810 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
24820 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
24830 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
24840 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
24850 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f  e = (nLoop<=1) ?
24860 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
24870 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
24880 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
24890 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
248a0 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
248b0 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
248c0 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28  begin solver.  (
248d0 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20  nRowEst=%d)\n", 
248e0 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a  nRowEst));..  /*
248f0 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a   If nRowEst is z
24900 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73  ero and there is
24910 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
24920 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20  use, ignore it. 
24930 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73  In this.  ** cas
24940 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  e the purpose of
24950 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
24960 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
24970 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
24980 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  urned.  ** by th
24990 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e  e overall query.
249a0 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d   Once this estim
249b0 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ate has been obt
249c0 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  ained, the calle
249d0 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f  r.  ** will invo
249e0 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
249f0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20   a second time, 
24a00 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69  passing the esti
24a10 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  mate as the.  **
24a20 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74   nRowEst paramet
24a30 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  er.  */.  if( pW
24a40 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
24a50 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
24a60 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  ){.    nOrderBy 
24a70 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24a80 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49    nOrderBy = pWI
24a90 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
24aa0 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
24ab0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
24ac0 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
24ad0 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64  r aTo, aFrom and
24ae0 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a   aSortCost[] */.
24af0 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65    nSpace = (size
24b00 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69  of(WherePath)+si
24b10 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
24b20 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65  *nLoop)*mxChoice
24b30 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20  *2;.  nSpace += 
24b40 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
24b50 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70   nOrderBy;.  pSp
24b60 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
24b70 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
24b80 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
24b90 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
24ba0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24bb0 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  PT;.  aTo = (Whe
24bc0 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
24bd0 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
24be0 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
24bf0 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
24c00 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
24c10 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
24c20 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
24c30 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
24c40 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
24c50 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
24c60 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
24c70 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
24c80 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
24c90 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  }.  if( nOrderBy
24ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
24cb0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
24cc0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74  BY clause and it
24cd0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67   is not being ig
24ce0 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20  nored, set up.  
24cf0 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
24d00 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61  he aSortCost[] a
24d10 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65  rray. Each eleme
24d20 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43  nt of the aSortC
24d30 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  ost array.    **
24d40 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20   is either zero 
24d50 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73  - meaning it has
24d60 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e   not yet been in
24d70 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74  itialized - or t
24d80 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
24d90 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73  f sorting nRowEs
24da0 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77  t rows of data w
24db0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58  here the first X
24dc0 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a   terms of.    **
24dd0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
24de0 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  ause are already
24df0 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65   in order, where
24e00 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20   X is the array 
24e10 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
24e20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74  */.    aSortCost
24e30 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a   = (LogEst*)pX;.
24e40 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74      memset(aSort
24e50 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
24e60 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
24e70 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  By);.  }.  asser
24e80 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20  t( aSortCost==0 
24e90 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
24ea0 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72  e]==(char*)&aSor
24eb0 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20  tCost[nOrderBy] 
24ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f  );.  assert( aSo
24ed0 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53  rtCost!=0 || &pS
24ee0 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
24ef0 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a  har*)pX );..  /*
24f00 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
24f10 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
24f20 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
24f30 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
24f40 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
24f50 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
24f60 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
24f70 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
24f80 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20  ove 28.  If the 
24f90 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
24fa0 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
24fb0 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
24fc0 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
24fd0 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20  n the first 28. 
24fe0 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
24ff0 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
25000 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
25010 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
25020 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
25030 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b  nQueryLoop, 48);
25040 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71    assert( 48==sq
25050 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20  lite3LogEst(28) 
25060 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
25070 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b    assert( aFrom[
25080 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20  0].isOrdered==0 
25090 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
250a0 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  y ){.    /* If n
250b0 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68  Loop is zero, th
250c0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
250d0 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68  FROM terms in th
250e0 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20  e query. Since. 
250f0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
25100 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79  se the query may
25110 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
25120 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68  m of one row, th
25130 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a  e results.    **
25140 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
25150 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72  the requested or
25160 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72  der. Set isOrder
25170 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74  ed to nOrderBy t
25180 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74  o.    ** indicat
25190 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e  e this. Or, if n
251a0 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  Loop is greater 
251b0 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69  than zero, set i
251c0 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20  sOrdered to.    
251d0 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  ** -1, indicatin
251e0 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  g that the resul
251f0 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79  t set may or may
25200 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c   not be ordered,
25210 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69   .    ** dependi
25220 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20  ng on the loops 
25230 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  added to the cur
25240 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20  rent plan.  */. 
25250 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
25260 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20  dered = nLoop>0 
25270 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b  ? -1 : nOrderBy;
25280 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
25290 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20  te successively 
252a0 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68  longer WherePath
252b0 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76  s using the prev
252c0 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a  ious generation.
252d0 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74    ** of WherePat
252e0 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20  hs as the basis 
252f0 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b  for the next.  K
25300 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
25310 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62   mxChoice.  ** b
25320 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63  est paths at eac
25330 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  h generation */.
25340 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
25350 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
25360 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20  p++){.    nTo = 
25370 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  0;.    for(ii=0,
25380 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69   pFrom=aFrom; ii
25390 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46  <nFrom; ii++, pF
253a0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  rom++){.      fo
253b0 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d  r(pWLoop=pWInfo-
253c0 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b  >pLoops; pWLoop;
253d0 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e   pWLoop=pWLoop->
253e0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
253f0 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b      LogEst nOut;
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69        /* Rows vi
25420 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b  sited by (pFrom+
25430 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
25440 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b     LogEst rCost;
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
25470 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  path (pFrom+pWLo
25480 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
25490 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b  ogEst rUnsorted;
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73   /* Unsorted cos
254c0 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  t of (pFrom+pWLo
254d0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  op) */.        i
254e0 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
254f0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20  rom->isOrdered; 
25500 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f   /* isOrdered fo
25510 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  r (pFrom+pWLoop)
25520 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
25530 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20  ask maskNew;    
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25550 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73   Mask of src vis
25560 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a  ited by (..) */.
25570 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
25580 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  revMask = 0;    
25590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
255a0 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c  k of rev-order l
255b0 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f  oops for (..) */
255c0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ..        if( (p
255d0 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
255e0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
255f0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
25600 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25610 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
25620 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
25630 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
25640 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25650 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25660 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
25670 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e  )!=0 && pFrom->n
25680 52 6f 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20  Row<3 ){.       
25690 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65     /* Do not use
256a0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
256b0 64 65 78 20 69 66 20 74 68 65 20 74 68 69 73 20  dex if the this 
256c0 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74 65 64  loop is expected
256d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
256e0 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31   run less than 1
256f0 2e 32 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69  .25 times.  It i
25700 73 20 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c  s tempting to al
25710 73 6f 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20  so exclude.     
25720 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
25730 63 20 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e  c index usage on
25740 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20   an outer loop, 
25750 62 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e  but sometimes an
25760 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20   automatic.     
25770 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73       ** index is
25780 20 75 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f   useful in the o
25790 75 74 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63  uter loop of a c
257a0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
257b0 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ry. */.         
257c0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
257d0 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
257e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
257f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nue;.        }..
25800 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
25810 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
25820 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
25830 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
25840 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
25850 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
25860 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
25870 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
25880 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
25890 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
258a0 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
258b0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
258c0 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
258d0 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
258e0 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
258f0 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
25900 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
25910 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
25920 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
25930 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
25940 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
25950 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
25960 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
25970 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
25980 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
25990 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
259a0 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
259d0 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
259e0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
259f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a00 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
25a10 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
25a20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25a30 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
25a40 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
25a50 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
25a60 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
25a70 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
25a80 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
25a90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
25aa0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
25ab0 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
25ac0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
25ad0 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
25ae0 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25b00 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
25b10 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
25b20 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
25b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
25b50 4e 47 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c  NG:  Add a small
25b60 20 65 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28   extra penalty (
25b70 35 29 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73  5) to sorting as
25b80 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   an.          **
25b90 20 65 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d   extra encouragm
25ba0 65 6e 74 20 74 6f 20 74 68 65 20 71 75 65 72 79  ent to the query
25bb0 20 70 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65   planner to sele
25bc0 63 74 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20  ct a plan.      
25bd0 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
25be0 20 72 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20   rows emerge in 
25bf0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
25c00 72 20 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f  r without any so
25c10 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rting.          
25c20 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ** required. */.
25c30 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
25c40 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
25c50 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
25c60 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
25c70 64 5d 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20  d]) + 5;..      
25c80 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
25c90 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
25ca0 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
25cb0 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
25cc0 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
25cd0 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
25ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25cf0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
25d00 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
25d10 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
25d20 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
25d30 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
25d40 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
25d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25d60 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
25d70 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  rted;.          
25d80 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20  rUnsorted -= 2; 
25d90 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69   /* TUNING:  Sli
25da0 67 68 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f  ght bias in favo
25db0 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61  r of no-sort pla
25dc0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ns */.        }.
25dd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
25de0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
25df0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
25e00 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
25e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
25e20 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
25e30 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
25e40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
25e50 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
25e60 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
25e70 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
25e80 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
25e90 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
25ea0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
25eb0 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
25ec0 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
25ed0 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
25ee0 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
25ef0 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
25f00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
25f10 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
25f20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
25f30 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
25f40 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
25f50 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
25f60 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
25f70 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
25f80 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
25f90 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
25fa0 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
25fb0 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
25fc0 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
25fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25fe0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
25ff0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
26000 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
26010 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
26020 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
26030 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
26040 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
26050 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
26060 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
26070 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
26080 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
26090 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
260a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
260b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
260c0 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
260d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
260e0 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
260f0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
26100 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
26110 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
26120 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
26130 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
26140 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
26150 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
26160 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
26170 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
26180 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
26190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
261a0 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
261b0 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
261c0 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
261d0 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
261e0 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
261f0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
26200 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
26210 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
26220 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
26230 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
26240 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
26250 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
26260 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
26270 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26280 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
26290 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
262a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
262b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
262c0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
262d0 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
262e0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
262f0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
26300 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
26310 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
26320 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
26330 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
26340 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
26350 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
26360 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
26370 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
26380 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
26390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
263a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
263b0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
263c0 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
263d0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
263e0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
263f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
26400 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
26410 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
26420 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
26430 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
26440 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
26450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26460 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
26470 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
26480 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
26490 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
264a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
264b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
264c0 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
264d0 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
264e0 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
264f0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
26500 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26510 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
26520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26530 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
26540 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
26550 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
26560 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
26570 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26580 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
26590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
265a0 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
265b0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
265c0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
265d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
265e0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
265f0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
26600 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
26610 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
26620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26630 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
26640 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
26650 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
26660 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26680 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
26690 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
266a0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
266b0 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
266c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
266d0 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
266e0 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
266f0 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73  same isOrdered s
26700 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
26710 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
26720 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
26730 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
26740 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
26750 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
26760 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
26770 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
26780 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e  ould be skipped.
26790 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
267a0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
267b0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61  conditional is a
267c0 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f  n expanded vecto
267d0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75  r comparison equ
267e0 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20  ivalent to:.    
267f0 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d        **   (pTo-
26800 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77  >rCost,pTo->nRow
26810 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29  ,pTo->rUnsorted)
26820 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c   <= (rCost,nOut,
26830 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20  rUnsorted).     
26840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26850 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
26860 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  <rCost .        
26870 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73     || (pTo->rCos
26880 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20  t==rCost.       
26890 20 20 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d          && (pTo-
268a0 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20  >nRow<nOut.     
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
268c0 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75   (pTo->nRow==nOu
268d0 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
268e0 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a  ted<=rUnsorted).
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20    ).            
26910 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b    ).          ){
26920 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
26930 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26940 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
26950 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26960 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
26970 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26980 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
269b0 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
269c0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
269d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
269e0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
269f0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
26a00 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
26a10 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
26a20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
26a30 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
26a40 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26a60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26a70 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
26a80 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
26a90 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26ab0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
26ac0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
26ad0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
26ae0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
26af0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
26b00 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65  ted, pTo->isOrde
26b10 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
26b20 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26b30 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26b40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26b50 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20       /* Discard 
26b60 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
26b70 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  th from further 
26b80 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
26b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26ba0 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
26bb0 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
26bc0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26be0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26bf0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
26c00 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
26c10 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
26c20 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68  aches here if th
26c30 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
26c40 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
26c50 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
26c60 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c   pTo path.  Repl
26c70 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65  ace pTo with the
26c80 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23   candidate. */.#
26c90 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
26ca0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
26cb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
26cc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26cd0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
26ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26cf0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
26d00 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
26d10 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
26d20 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
26d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26d40 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
26d50 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
26d60 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
26d70 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26d90 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
26da0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26db0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26dc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26dd0 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
26de0 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26df0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
26e00 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26e10 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
26e20 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
26e30 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
26e40 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
26e50 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
26e60 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
26e70 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
26e80 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
26e90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
26ea0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
26eb0 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
26ec0 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
26ed0 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
26ee0 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
26ef0 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
26f00 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
26f10 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
26f20 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
26f30 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
26f40 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
26f50 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
26f60 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
26f70 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
26f80 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
26f90 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
26fa0 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
26fb0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
26fc0 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
26fd0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
26fe0 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
26ff0 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
27000 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
27010 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
27020 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
27030 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
27040 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
27050 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
27060 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
27070 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
27080 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
27090 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
270a0 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
270b0 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
270c0 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
270d0 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
270e0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
270f0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
27100 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
27110 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
27120 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
27130 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
27140 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
27150 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
27160 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
27170 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
27180 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
27190 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
271a0 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
271b0 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
271c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
271d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
271e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
271f0 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
27200 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
27210 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
27220 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
27230 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
27240 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27250 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
27260 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
27270 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
27280 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
27290 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
272a0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
272b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
272c0 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
272d0 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
272e0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
272f0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
27300 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
27310 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
27320 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
27330 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
27340 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
27350 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
27360 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
27370 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
27380 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
27390 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
273a0 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
273b0 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
273c0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
273d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
273e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
273f0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
27400 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27410 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
27420 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
27430 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
27440 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
27450 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
27460 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
27470 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
27480 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
27490 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
274a0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
274b0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
274c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
274d0 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
274e0 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
274f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
27500 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
27510 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
27520 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
27530 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
27540 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
27550 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
27560 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
27570 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
27580 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
27590 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
275a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
275b0 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
275c0 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
275d0 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
275e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
275f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
27600 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
27610 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
27620 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
27630 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
27640 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
27650 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
27660 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
27670 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
27680 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
27690 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
276a0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
276b0 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
276c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
276d0 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
276e0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
276f0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
27700 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
27710 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
27720 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
27730 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
27740 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
27750 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
27760 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27770 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
27780 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
27790 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
277a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
277b0 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
277c0 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
277d0 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
277e0 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
277f0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
27800 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
27810 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
27820 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
27830 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
27840 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
27850 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
27860 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
27870 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
27880 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
27890 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
278a0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
278b0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
278c0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
278d0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
278e0 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
278f0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  Loop = 0;.  if( 
27900 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
27910 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
27920 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27930 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
27940 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
27950 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
27960 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
27970 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
27980 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
27990 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
279a0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
279b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
279c0 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
279d0 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
279e0 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
279f0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
27a00 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
27a10 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  op;.      if( pW
27a20 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20  Info->nOBSat<=0 
27a30 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
27a40 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
27a50 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70         if( nLoop
27a60 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
27a70 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46  u32 wsFlags = pF
27a80 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
27a90 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  -1]->wsFlags;.  
27aa0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46          if( (wsF
27ab0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
27ac0 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  ROW)==0 .       
27ad0 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26      && (wsFlags&
27ae0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
27af0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57  _COLUMN_IN))!=(W
27b00 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43  HERE_IPK|WHERE_C
27b10 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20  OLUMN_IN).      
27b20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
27b30 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30     Bitmask m = 0
27b40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
27b50 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
27b60 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
27b70 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
27b80 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
27b90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27ba0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
27bb0 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
27bc0 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
27bd0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
27be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
27bf0 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
27c00 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20  & WHERE_IPK );. 
27c10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
27c20 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
27c30 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
27c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27c50 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ( rc==pWInfo->pO
27c60 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
27c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
27c80 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49  WInfo->bOrderedI
27c90 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20  nnerLoop = 1;.  
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
27cb0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b  fo->revMask = m;
27cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27cd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27ce0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27cf0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
27d00 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27d10 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
27d20 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
27d30 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
27d40 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
27d50 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e  >nExpr && nLoop>
27d60 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42  0.    ){.      B
27d70 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
27d80 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   0;.      int nO
27d90 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68  rder = wherePath
27da0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
27db0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
27dc0 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
27dd0 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20        pFrom, 0, 
27de0 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
27df0 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
27e00 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29  &revMask.      )
27e10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27e20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d  pWInfo->sorted==
27e30 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
27e40 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70  Order==pWInfo->p
27e50 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
27e60 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
27e70 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  ->sorted = 1;.  
27e80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
27e90 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
27ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27eb0 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   }...  pWInfo->n
27ec0 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
27ed0 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
27ee0 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
27ef0 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
27f00 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
27f10 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53  3DbFreeNN(db, pS
27f20 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
27f30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27f40 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
27f50 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
27f60 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
27f70 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
27f80 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
27f90 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
27fa0 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
27fb0 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
27fc0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
27fd0 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
27fe0 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
27ff0 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
28000 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
28010 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
28020 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
28030 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
28040 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
28050 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
28060 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
28070 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
28080 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
28090 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
280a0 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
280b0 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
280c0 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
280d0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
280e0 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
280f0 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
28100 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
28110 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
28120 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
28130 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
28140 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
28150 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
28160 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
28170 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
28180 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
28190 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
281a0 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
281b0 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
281c0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
281d0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
281e0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
281f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
28200 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
28210 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
28220 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
28230 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
28240 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65  R_SUBCLAUSE ) re
28250 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
28260 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
28270 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
28280 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
28290 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
282a0 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
282b0 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
282c0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
282d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
282e0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
282f0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
28300 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
28310 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
28320 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
28330 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
28340 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
28350 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
28360 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  Loop->nSkip = 0;
28370 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74  .  pTerm = sqlit
28380 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
28390 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
283a0 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30  , WO_EQ|WO_IS, 0
283b0 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
283c0 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
283d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
283e0 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
283f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
28400 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
28410 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
28420 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
28430 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
28440 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
28450 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
28460 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
28470 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
28480 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
28490 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
284a0 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
284b0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
284c0 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
284d0 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
284e0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
284f0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
28500 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
28510 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
28520 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20  nt opMask;.     
28530 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
28540 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
28550 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
28560 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
28570 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20  eIndex(pIdx).   
28580 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
28590 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
285a0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
285b0 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65  KeyCol>ArraySize
285c0 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
285d0 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
285e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70  ntinue;.      op
285f0 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69  Mask = pIdx->uni
28600 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45  qNotNull ? (WO_E
28610 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51  Q|WO_IS) : WO_EQ
28620 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
28630 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
28640 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
28650 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
28660 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
28670 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70  , iCur, j, 0, op
28680 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
28690 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
286a0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
286b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
286c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
286d0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
286e0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
286f0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
28700 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
28710 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
28720 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28730 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
28740 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
28750 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
28760 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
28770 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
28780 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
28790 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64  m->colUsed & pId
287a0 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d  x->colNotIdxed)=
287b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
287c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
287d0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
287e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
287f0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
28800 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
28810 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
28820 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
28830 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
28840 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
28850 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
28860 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
28870 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
28880 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
28890 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
288a0 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
288b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
288c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
288d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
288e0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
288f0 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
28900 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
28910 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
28920 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
28930 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26  >sMaskSet.n==1 &
28940 26 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e  & iCur==pWInfo->
28950 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29  sMaskSet.ix[0] )
28960 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
28970 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71  kSelf = 1; /* sq
28980 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
28990 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
289a0 53 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20  Set, iCur); */. 
289b0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
289c0 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
289d0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
289e0 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
289f0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
28a00 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
28a10 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  at =  pWInfo->pO
28a20 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
28a30 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
28a40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28a50 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
28a60 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
28a70 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
28a80 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
28a90 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
28aa0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28ab0 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
28ac0 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
28ad0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28ae0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28af0 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
28b00 6e 20 66 6f 72 20 65 78 70 72 49 73 44 65 74 65  n for exprIsDete
28b10 72 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a  rministic()..*/.
28b20 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
28b30 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74  odeIsDeterminist
28b40 69 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ic(Walker *pWalk
28b50 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
28b60 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
28b70 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
28b80 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
28b90 79 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73  y(pExpr, EP_Cons
28ba0 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20  tFunc)==0 ){.   
28bb0 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
28bc0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
28bd0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
28be0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28bf0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  inue;.}../*.** R
28c00 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
28c10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
28c20 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74  tains no non-det
28c30 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a  erministic SQL .
28c40 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f  ** functions. Do
28c50 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f   not consider no
28c60 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
28c70 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  SQL functions th
28c80 61 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20  at are .** part 
28c90 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74  of sub-select st
28ca0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
28cb0 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 44 65  tic int exprIsDe
28cc0 74 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72  terministic(Expr
28cd0 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77   *p){.  Walker w
28ce0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
28cf0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
28d00 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
28d10 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
28d20 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72   exprNodeIsDeter
28d30 6d 69 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53  ministic;.  w.xS
28d40 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
28d50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
28d60 6b 46 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  kFail;.  sqlite3
28d70 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
28d80 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
28d90 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
28da0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
28db0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
28dc0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
28dd0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
28de0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
28df0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
28e00 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
28e10 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
28e20 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
28e30 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
28e40 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
28e50 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
28e60 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
28e70 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
28e80 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
28e90 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
28ea0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
28eb0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
28ec0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
28ed0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
28ee0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
28ef0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
28f00 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
28f10 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
28f20 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
28f30 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
28f40 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
28f50 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
28f60 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
28f70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
28f80 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
28f90 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
28fa0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
28fb0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
28fc0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
28fd0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
28fe0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
28ff0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
29000 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
29010 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
29020 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
29030 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
29040 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
29050 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
29060 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
29070 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
29080 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
29090 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
290a0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
290b0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
290c0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
290d0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
290e0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
290f0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
29100 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
29110 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
29120 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
29130 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
29140 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
29170 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
29180 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
29190 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
291a0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
291b0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
291e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
291f0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
29200 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
29210 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
29220 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
29230 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29240 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
29250 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
29260 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
29270 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
29280 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
29290 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
292a0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
292b0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
292c0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
292d0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
292e0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
292f0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
29300 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
29310 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
29320 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
29330 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
29340 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
29350 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
29360 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
29370 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
29380 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
29390 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
293a0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
293b0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
293c0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
293d0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
293e0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
293f0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
29400 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
29410 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
29420 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
29430 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
29440 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
29450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
29460 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
29470 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
29480 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
29490 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
294a0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
294b0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
294c0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
294d0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
294e0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
294f0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
29500 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
29510 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
29520 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
29530 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
29540 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
29550 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
29560 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
29570 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
29580 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
29590 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
295a0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
295b0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
295c0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
295d0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
295e0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
295f0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
29600 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
29610 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
29620 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
29630 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
29640 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
29650 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
29660 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
29670 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
29680 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
29690 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
296a0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
296b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
296c0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
296d0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
296e0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
296f0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
29700 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
29710 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
29720 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
29730 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
29740 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
29750 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
29760 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
29770 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
29780 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
29790 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
297a0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
297b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
297c0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
297d0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
297e0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
297f0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
29800 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
29810 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
29820 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
29830 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
29840 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
29850 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
29860 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
29870 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
29880 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
29890 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
298a0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
298b0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
298c0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
298d0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
298e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
298f0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
29900 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
29910 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
29920 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
29930 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
29940 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
29950 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
29960 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
29970 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
29980 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
29990 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
299a0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
299b0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
299c0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
299d0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
299e0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
299f0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
29a00 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
29a10 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
29a20 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
29a30 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
29a40 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
29a50 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
29a60 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
29a70 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
29a80 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
29a90 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
29aa0 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
29ab0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
29ac0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
29ad0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
29ae0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
29af0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
29b00 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
29b10 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
29b20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
29b30 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
29b40 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
29b50 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
29b60 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
29b70 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69  E_OR_SUBCLAUSE i
29b80 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
29b90 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
29ba0 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
29bb0 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
29bc0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
29bd0 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
29be0 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
29bf0 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
29c00 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
29c10 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
29c20 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
29c30 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
29c40 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
29c50 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
29c60 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
29c70 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
29c80 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
29c90 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
29ca0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
29cb0 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
29cc0 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
29cd0 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
29ce0 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
29cf0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
29d00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
29d10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
29d20 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
29d30 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29d40 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  t,      /* FROM 
29d50 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
29d60 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
29d70 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
29d80 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
29d90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
29da0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
29db0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
29dc0 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f  rBy,     /* An O
29dd0 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
29de0 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72  P BY) clause, or
29df0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
29e00 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
29e10 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75     /* Query resu
29e20 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64 20 66  lt set.  Req'd f
29e30 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  or DISTINCT */. 
29e40 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
29e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29e60 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
29e70 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
29e80 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41  nt.h */.  int iA
29e90 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20  uxArg           
29ea0 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52    /* If WHERE_OR
29eb0 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
29ec0 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
29ed0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ef0 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45   ** If WHERE_USE
29f00 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65  _LIMIT, then the
29f10 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f   limit amount */
29f20 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
29f30 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
29f40 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
29f50 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
29f60 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
29f70 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f90 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
29fa0 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
29fb0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
29fc0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
29fd0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
29fe0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
29ff0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a000 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
2a010 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
2a020 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2a030 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
2a040 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2a050 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
2a060 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
2a070 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
2a080 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
2a090 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
2a0a0 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
2a0b0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
2a0c0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2a0d0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2a0e0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2a0f0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2a100 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2a110 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2a120 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2a130 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2a140 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2a150 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
2a160 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
2a170 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
2a180 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2a1b0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
2a1c0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a1d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2a1e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2a1f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a210 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
2a220 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
2a230 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
2a240 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
2a250 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
2a260 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
2a270 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2a280 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a290 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
2a2a0 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
2a2b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2a2c0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
2a2d0 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
2a2e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a2f0 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
2a300 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
2a310 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
2a320 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57  R_SUBCLAUSE or W
2a330 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
2a340 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
2a350 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a360 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2a370 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2a380 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a390 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
2a3a0 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
2a3b0 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
2a3c0 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
2a3d0 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
2a3e0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
2a3f0 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
2a400 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
2a410 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
2a420 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
2a430 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
2a440 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
2a450 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
2a460 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
2a470 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
2a480 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
2a490 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
2a4a0 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
2a4b0 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
2a4c0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
2a4d0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
2a4e0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
2a4f0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
2a500 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
2a510 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
2a520 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
2a530 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2a540 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
2a550 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
2a560 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
2a570 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2a580 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
2a590 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
2a5a0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
2a5b0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
2a5c0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2a5d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a5e0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
2a5f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2a600 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
2a610 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
2a620 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
2a630 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
2a640 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2a650 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
2a660 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2a670 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
2a680 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
2a690 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
2a6a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2a6b0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2a6c0 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
2a6d0 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
2a6e0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
2a6f0 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
2a700 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
2a710 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2a720 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  SE flag is set, 
2a730 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2a740 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2a750 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2a760 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2a770 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2a780 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2a790 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2a7a0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2a7b0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2a7c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2a7d0 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2a7e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a7f0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2a800 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
2a810 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
2a820 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2a830 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
2a840 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
2a850 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
2a860 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
2a870 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
2a880 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
2a890 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
2a8a0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
2a8b0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
2a8c0 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
2a8d0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
2a8e0 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
2a8f0 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
2a900 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
2a910 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
2a920 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
2a930 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
2a940 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
2a950 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
2a960 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
2a970 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
2a980 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
2a990 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
2a9a0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
2a9b0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
2a9c0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
2a9d0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
2a9e0 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
2a9f0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
2aa00 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2aa10 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
2aa20 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
2aa30 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
2aa40 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
2aa50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2aa60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2aa70 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2aa80 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
2aa90 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2aaa0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
2aab0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2aac0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2aad0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2aae0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2aaf0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
2ab00 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
2ab10 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
2ab20 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c    pWInfo->pResul
2ab30 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65  tSet = pResultSe
2ab40 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43  t;.  pWInfo->aiC
2ab50 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
2ab60 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
2ab70 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  ass[1] = -1;.  p
2ab80 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
2ab90 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
2aba0 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49  fo->iBreak = pWI
2abb0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2abc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2abd0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
2abe0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
2abf0 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
2ac00 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20  WInfo->iLimit = 
2ac10 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66  iAuxArg;.  pWInf
2ac20 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
2ac30 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
2ac40 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65  eryLoop;.  memse
2ac50 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  t(&pWInfo->nOBSa
2ac60 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
2ac70 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e  offsetof(WhereIn
2ac80 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73 65 74  fo,sWC) - offset
2ac90 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e 4f 42  of(WhereInfo,nOB
2aca0 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Sat));.  memset(
2acb0 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30  &pWInfo->a[0], 0
2acc0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
2acd0 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73 69 7a  op)+nTabList*siz
2ace0 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
2acf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
2ad00 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2ad10 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a  EPASS_OFF );  /*
2ad20 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74   ONEPASS default
2ad30 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d  s to OFF */.  pM
2ad40 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
2ad50 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57  ->sMaskSet;.  sW
2ad60 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  LB.pWInfo = pWIn
2ad70 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d  fo;.  sWLB.pWC =
2ad80 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
2ad90 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68   sWLB.pNew = (Wh
2ada0 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72  ereLoop*)(((char
2adb0 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57  *)pWInfo)+nByteW
2adc0 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
2add0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2ade0 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29  NMENT(sWLB.pNew)
2adf0 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49   );.  whereLoopI
2ae00 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a  nit(sWLB.pNew);.
2ae10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2ae20 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d  BUG.  sWLB.pNew-
2ae30 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64  >cId = '*';.#end
2ae40 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  if..  /* Split t
2ae50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2ae60 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
2ae70 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
2ae80 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
2ae90 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
2aea0 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
2aeb0 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
2aec0 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
2aed0 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
2aee0 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e  te3WhereClauseIn
2aef0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
2af00 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69   pWInfo);.  sqli
2af10 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70  te3WhereSplit(&p
2af20 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65  WInfo->sWC, pWhe
2af30 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
2af40 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
2af50 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61  ase: No FROM cla
2af60 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  use.  */.  if( n
2af70 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  TabList==0 ){.  
2af80 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
2af90 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
2afa0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
2afb0 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  r;.    if( wctrl
2afc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2afd0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2afe0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2aff0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2b000 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2b010 20 20 20 20 7d 0a 20 20 20 20 45 78 70 6c 61 69      }.    Explai
2b020 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
2b030 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 43 4f 4e  se, 0, "SCAN CON
2b040 53 54 41 4e 54 20 52 4f 57 22 29 29 3b 0a 20 20  STANT ROW"));.  
2b050 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73  }else{.    /* As
2b060 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
2b070 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
2b080 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2b090 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
2b0a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b0b0 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
2b0c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2b0d0 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
2b0e0 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20  sk of 1<<N..    
2b0f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
2b100 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  le of the previo
2b110 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75  us sentence ensu
2b120 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73  res thta if X is
2b130 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2b140 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  .    ** a table 
2b150 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74  T, then X-1 is t
2b160 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
2b170 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ll other tables 
2b180 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54  to the left of T
2b190 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67  ..    ** Knowing
2b1a0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2b1b0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2b1c0 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
2b1d0 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a  t join is.    **
2b1e0 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
2b1f0 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 20 20 2a  ket #3015..    *
2b200 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
2b210 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
2b220 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
2b230 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
2b240 61 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  ables in.    ** 
2b250 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
2b260 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
2b270 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
2b280 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
2b290 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c  lly.    ** equal
2b2a0 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
2b2b0 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
2b2c0 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
2b2d0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48 45  f the.    ** WHE
2b2e0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
2b2f0 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20  flag is set..   
2b300 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a   */.    ii = 0;.
2b310 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 63 72      do{.      cr
2b320 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
2b330 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2b340 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2b350 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
2b360 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73  abFuncArgs(pPars
2b370 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e, &pTabList->a[
2b380 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ii], &pWInfo->sW
2b390 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  C);.    }while( 
2b3a0 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73 74 2d  (++ii)<pTabList-
2b3b0 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69 66 64 65  >nSrc );.  #ifde
2b3c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2b3d0 20 20 20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61     {.      Bitma
2b3e0 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20  sk mx = 0;.     
2b3f0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
2b400 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
2b410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
2b420 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
2b430 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
2b440 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2b450 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2b460 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b470 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20   m>=mx );.      
2b480 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20    mx = m;.      
2b490 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66  }.    }.  #endif
2b4a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61  .  }.  .  /* Ana
2b4b0 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
2b4c0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
2b4d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
2b4e0 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61  eExprAnalyze(pTa
2b4f0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
2b500 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
2b510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2b520 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2b530 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69  ror;..  /* Speci
2b540 61 6c 20 63 61 73 65 3a 20 57 48 45 52 45 20 74  al case: WHERE t
2b550 65 72 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  erms that do not
2b560 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 74 61   refer to any ta
2b570 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2b580 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20  .  ** (constant 
2b590 65 78 70 72 65 73 73 69 6f 6e 73 29 2e 20 45 76  expressions). Ev
2b5a0 61 6c 75 61 74 65 20 65 61 63 68 20 73 75 63 68  aluate each such
2b5b0 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20   term, and jump 
2b5c0 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a  over all the.  *
2b5d0 2a 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  * generated code
2b5e0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
2b5f0 73 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20 20  s not true.  .  
2b600 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64  **.  ** Do not d
2b610 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 65 78  o this if the ex
2b620 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
2b630 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  s non-determinis
2b640 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  tic functions.  
2b650 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2b660 77 69 74 68 69 6e 20 61 20 73 75 62 2d 73 65 6c  within a sub-sel
2b670 65 63 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ect. This is not
2b680 20 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72   strictly requir
2b690 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72 65  ed, but.  ** pre
2b6a0 73 65 72 76 65 73 20 53 51 4c 69 74 65 27 73 20  serves SQLite's 
2b6b0 6c 65 67 61 63 79 20 62 65 68 61 76 69 6f 75 72  legacy behaviour
2b6c0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2b6d0 67 20 74 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a  g two cases:.  *
2b6e0 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e  *.  **   FROM ..
2b6f0 2e 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29  . WHERE random()
2b700 3e 30 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d  >0;           --
2b710 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f   eval random() o
2b720 6e 63 65 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a  nce per row.  **
2b730 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52     FROM ... WHER
2b740 45 20 28 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  E (SELECT random
2b750 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20  ())>0;  -- eval 
2b760 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76  random() once ov
2b770 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72  erall.  */.  for
2b780 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
2b790 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
2b7a0 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
2b7b0 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d  *pT = &sWLB.pWC-
2b7c0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  >a[ii];.    if( 
2b7d0 70 54 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  pT->wtFlags & TE
2b7e0 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e  RM_VIRTUAL ) con
2b7f0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2b800 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20  T->prereqAll==0 
2b810 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
2b820 7c 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d 69  || exprIsDetermi
2b830 6e 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72  nistic(pT->pExpr
2b840 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
2b850 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2b860 50 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72  Parse, pT->pExpr
2b870 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2b880 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2b890 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e  ULL);.      pT->
2b8a0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2b8b0 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
2b8c0 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
2b8d0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2b8e0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
2b8f0 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
2b900 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
2b910 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2b920 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
2b930 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
2b940 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
2b950 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
2b960 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
2b970 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
2b980 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2b990 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2b9a0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
2b9b0 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
2b9c0 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
2b9d0 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
2b9e0 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
2b9f0 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
2ba00 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
2ba10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
2ba20 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
2ba30 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
2ba40 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
2ba50 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
2ba60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2ba70 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
2ba80 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2ba90 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2baa0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2bab0 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
2bac0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
2bad0 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  ffff ){.    sqli
2bae0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2baf0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
2bb00 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c  art *** (wctrlFl
2bb10 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c  ags: 0x%x",wctrl
2bb20 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
2bb30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2bb40 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a  RE_USE_LIMIT ){.
2bb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2bb60 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69  ugPrintf(", limi
2bb70 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29  t: %d", iAuxArg)
2bb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2bb90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2bba0 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )\n");.  }.  if(
2bbb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2bbc0 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a  ce & 0x100 ){ /*
2bbd0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
2bbe0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
2bbf0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  clause */.    sq
2bc00 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
2bc10 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b  Print(sWLB.pWC);
2bc20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2bc30 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
2bc40 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
2bc50 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
2bc60 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2bc70 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
2bc80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2bc90 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2bca0 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
2bcb0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2bcc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2bcd0 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
2bce0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
2bcf0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2bd00 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
2bd10 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
2bd20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2bd30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2bd40 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
2bd50 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
2bd60 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
2bd70 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bda0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
2bdb0 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
2bdc0 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
2bdd0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
2bde0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
2bdf0 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
2be00 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
2be10 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65  [i%(sizeof(zLabe
2be20 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20  l)-1)];.        
2be30 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2be40 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
2be50 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2be60 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
2be70 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2be80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
2be90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2bea0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2beb0 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
2bec0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
2bed0 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
2bee0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2bef0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2bf00 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
2bf10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2bf20 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2bf30 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
2bf40 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
2bf50 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
2bf60 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2bf70 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
2bf80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
2bf90 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41  nfo->revMask = A
2bfa0 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66  LLBITS;.  }.  if
2bfb0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2bfc0 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
2bfd0 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
2bfe0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2bff0 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
2c000 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2c010 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2c020 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
2c030 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c040 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
2c050 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
2c060 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
2c070 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2c080 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
2c090 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c0a0 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
2c0b0 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
2c0c0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
2c0d0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
2c0e0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
2c0f0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2c100 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
2c110 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2c120 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
2c130 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2c140 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2c150 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
2c160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c170 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2c180 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2c190 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2c1a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c1b0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
2c1c0 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
2c1d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2c1e0 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2c1f0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2c200 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2c210 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c220 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
2c230 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2c240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c250 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2c260 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2c270 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
2c280 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
2c290 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
2c2a0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
2c2b0 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
2c2c0 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
2c2d0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
2c2e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ndif..  /* Attem
2c2f0 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
2c300 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
2c310 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66 66 65  that do not affe
2c320 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  ct the result.. 
2c330 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20   ** For a table 
2c340 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  to not affect th
2c350 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20 66 6f  e result, the fo
2c360 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20  llowing must be 
2c370 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
2c380 20 20 31 29 20 54 68 65 20 71 75 65 72 79 20 6d    1) The query m
2c390 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  ust not be an ag
2c3a0 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20 20 20  gregate..  **   
2c3b0 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73  2) The table mus
2c3c0 74 20 62 65 20 74 68 65 20 52 48 53 20 6f 66 20  t be the RHS of 
2c3d0 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a  a LEFT JOIN..  *
2c3e0 2a 20 20 20 33 29 20 45 69 74 68 65 72 20 74 68  *   3) Either th
2c3f0 65 20 71 75 65 72 79 20 6d 75 73 74 20 62 65 20  e query must be 
2c400 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65 6c 73  DISTINCT, or els
2c410 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  e the ON or USIN
2c420 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 20 20  G clause.  **   
2c430 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20     must contain 
2c440 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61  a constraint tha
2c450 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73 63 61  t limits the sca
2c460 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  n of the table t
2c470 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 74 20  o .  **      at 
2c480 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f  most a single ro
2c490 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54 68 65  w..  **   4) The
2c4a0 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20   table must not 
2c4b0 62 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  be referenced by
2c4c0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
2c4d0 20 71 75 65 72 79 20 61 70 61 72 74 0a 20 20 2a   query apart.  *
2c4e0 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74 73 20  *      from its 
2c4f0 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20  own USING or ON 
2c500 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
2c510 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67  * For example, g
2c520 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iven:.  **.  ** 
2c530 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2c540 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t1(ipk INTEGER 
2c550 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 31 29  PRIMARY KEY, v1)
2c560 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
2c570 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b 20 49  E TABLE t2(ipk I
2c580 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2c590 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20 20 20  EY, v2);.  **   
2c5a0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2c5b0 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52  3(ipk INTEGER PR
2c5c0 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29 3b 0a  IMARY KEY, v3);.
2c5d0 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e 20 74    **.  ** then t
2c5e0 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65 20 6f  able t2 can be o
2c5f0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
2c600 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
2c610 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2c620 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a  v1, v3 FROM t1 .
2c630 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2c640 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20 28 74  JOIN t2 USING (t
2c650 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a 20 20  1.ipk=t2.ipk).  
2c660 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f  **       LEFT JO
2c670 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31 2e  IN t3 USING (t1.
2c680 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2a  ipk=t3.ipk).  **
2c690 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20  .  ** or from:. 
2c6a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2c6b0 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 31 2c  ECT DISTINCT v1,
2c6c0 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a   v3 FROM t1 .  *
2c6d0 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49  *       LEFT JOI
2c6e0 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  N t2.  **       
2c6f0 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55 53 49  LEFT JOIN t3 USI
2c700 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70  NG (t1.ipk=t3.ip
2c710 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  k).  */.  notRea
2c720 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2c730 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2c740 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
2c750 70 52 65 73 75 6c 74 53 65 74 21 3d 30 20 20 20  pResultSet!=0   
2c760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2c770 75 61 72 61 6e 74 65 65 73 20 63 6f 6e 64 69 74  uarantees condit
2c780 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 20 2a 2f  ion (1) above */
2c790 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
2c7a0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2c7b0 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2c7c0 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  in).  ){.    int
2c7d0 20 69 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   i;.    Bitmask 
2c7e0 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
2c7f0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2c800 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
2c810 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
2c820 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
2c830 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
2c840 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
2c850 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
2c860 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
2c870 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
2c880 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d     for(i=pWInfo-
2c890 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b  >nLevel-1; i>=1;
2c8a0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57 68 65   i--){.      Whe
2c8b0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2c8c0 70 45 6e 64 3b 0a 20 20 20 20 20 20 73 74 72 75  pEnd;.      stru
2c8d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2c8e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 70 4c  *pItem;.      pL
2c8f0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
2c900 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  i].pWLoop;.     
2c910 20 70 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f   pItem = &pWInfo
2c920 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2c930 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20 20 20  oop->iTab];.    
2c940 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2c950 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
2c960 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  EFT)==0 ) contin
2c970 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ue;.      if( (w
2c980 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2c990 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
2c9a0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
2c9b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c9c0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2c9d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2c9e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2c9f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
2ca00 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
2ca10 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 63  maskSelf)!=0 ) c
2ca20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2ca30 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e  End = sWLB.pWC->
2ca40 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  a + sWLB.pWC->nT
2ca50 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  erm;.      for(p
2ca60 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61  Term=sWLB.pWC->a
2ca70 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54  ; pTerm<pEnd; pT
2ca80 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2ca90 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
2caa0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
2cab0 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20  askSelf)!=0 ){. 
2cac0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78           if( !Ex
2cad0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
2cae0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
2caf0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
2cb00 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 45      || pTerm->pE
2cb10 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
2cb20 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69 43 75  able!=pItem->iCu
2cb30 72 73 6f 72 0a 20 20 20 20 20 20 20 20 20 20 29  rsor.          )
2cb40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
2cb50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2cb60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cb70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
2cb80 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74 69 6e  rm<pEnd ) contin
2cb90 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
2cba0 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2cbb0 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2cbc0 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2cbd0 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2cbe0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 70 4c 6f  notReady &= ~pLo
2cbf0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2cc00 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
2cc10 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
2cc20 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
2cc30 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2cc40 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2cc50 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2cc60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2cc70 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
2cc80 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
2cc90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cca0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 70  }.      if( i!=p
2ccb0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20  WInfo->nLevel-1 
2ccc0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2ccd0 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  Byte = (pWInfo->
2cce0 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20 73 69  nLevel-1-i) * si
2ccf0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2cd00 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
2cd10 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c  e(&pWInfo->a[i],
2cd20 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d   &pWInfo->a[i+1]
2cd30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2cd40 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  }.      pWInfo->
2cd50 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
2cd60 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
2cd70 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
2cd80 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
2cd90 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
2cda0 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
2cdb0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
2cdc0 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
2cdd0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
2cde0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
2cdf0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
2ce00 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2ce10 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
2ce20 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
2ce30 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
2ce40 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
2ce50 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
2ce60 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 0a 20  ropriate..  **. 
2ce70 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73 20 61   ** A one-pass a
2ce80 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75  pproach can be u
2ce90 73 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 65  sed if the calle
2cea0 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
2ceb0 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65 69 74  one.  ** and eit
2cec0 68 65 72 20 28 61 29 20 74 68 65 20 73 63 61 6e  her (a) the scan
2ced0 20 76 69 73 69 74 73 20 61 74 20 6d 6f 73 74 20   visits at most 
2cee0 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62 29 20 65  one row or (b) e
2cef0 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ach.  ** of the 
2cf00 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2cf10 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
2cf20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  * the caller has
2cf30 20 69 6e 64 69 63 61 74 65 64 20 74 68 61 74 20   indicated that 
2cf40 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  a one-pass appro
2cf50 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ach can be used.
2cf60 20 20 2a 2a 20 20 20 20 20 77 69 74 68 20 6d 75    **     with mu
2cf70 6c 74 69 70 6c 65 20 72 6f 77 73 20 28 62 79 20  ltiple rows (by 
2cf80 73 65 74 74 69 6e 67 20 57 48 45 52 45 5f 4f 4e  setting WHERE_ON
2cf90 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 2c  EPASS_MULTIROW),
2cfa0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 74 68   and.  **   * th
2cfb0 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
2cfc0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
2cfd0 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65 69 74  and.  **   * eit
2cfe0 68 65 72 20 74 68 65 20 73 63 61 6e 20 64 6f 65  her the scan doe
2cff0 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20 4f 52  s not use the OR
2d000 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 72   optimization or
2d010 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
2d020 20 20 20 20 20 69 73 20 61 20 44 45 4c 45 54 45       is a DELETE
2d030 20 6f 70 65 72 61 74 69 6f 6e 20 28 57 48 45 52   operation (WHER
2d040 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 20  E_DUPLICATES_OK 
2d050 69 73 20 6f 6e 6c 79 20 73 70 65 63 69 66 69 65  is only specifie
2d060 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 44  d.  **     for D
2d070 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a  ELETE)..  **.  *
2d080 2a 20 54 68 65 20 6c 61 73 74 20 71 75 61 6c 69  * The last quali
2d090 66 69 63 61 74 69 6f 6e 20 69 73 20 62 65 63 61  fication is beca
2d0a0 75 73 65 20 61 6e 20 55 50 44 41 54 45 20 73 74  use an UPDATE st
2d0b0 61 74 65 6d 65 6e 74 20 75 73 65 73 0a 20 20 2a  atement uses.  *
2d0c0 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 69 43 75  * WhereInfo.aiCu
2d0d0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f 20 64  rOnePass[1] to d
2d0e0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2d0f0 20 6f 72 20 6e 6f 74 20 69 74 20 72 65 61 6c 6c   or not it reall
2d100 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61  y can.  ** use a
2d110 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61   one-pass approa
2d120 63 68 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ch, and this is 
2d130 6e 6f 74 20 73 65 74 20 61 63 63 75 72 61 74 65  not set accurate
2d140 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a 20 20 2a  ly for scans.  *
2d150 2a 20 74 68 61 74 20 75 73 65 20 74 68 65 20 4f  * that use the O
2d160 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  R optimization..
2d170 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
2d180 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d190 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2d1a0 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
2d1b0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
2d1c0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2d1d0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2d1e0 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a  _DESIRED)!=0 ){.
2d1f0 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
2d200 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  = pWInfo->a[0].p
2d210 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
2d220 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20      int bOnerow 
2d230 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  = (wsFlags & WHE
2d240 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20  RE_ONEROW)!=0;. 
2d250 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c     if( bOnerow |
2d260 7c 20 28 0a 20 20 20 20 20 20 20 20 30 21 3d 28  | (.        0!=(
2d270 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d280 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2d290 52 4f 57 29 0a 20 20 20 20 20 26 26 20 30 3d 3d  ROW).     && 0==
2d2a0 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
2d2b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
2d2c0 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73 46 6c      && (0==(wsFl
2d2d0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2d2e0 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
2d2f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
2d300 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20 20 20  LICATES_OK)).   
2d310 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66   )){.      pWInf
2d320 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f  o->eOnePass = bO
2d330 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f  nerow ? ONEPASS_
2d340 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53  SINGLE : ONEPASS
2d350 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66  _MULTI;.      if
2d360 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c  ( HasRowid(pTabL
2d370 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
2d380 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
2d390 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
2d3a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74  .        if( wct
2d3b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d3c0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2d3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
2d3e0 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41  ordelete = OPFLA
2d3f0 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20  G_FORDELETE;.   
2d400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2d410 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2d420 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77  op->wsFlags = (w
2d430 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f  sFlags & ~WHERE_
2d440 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  IDX_ONLY);.     
2d450 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d460 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
2d470 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
2d480 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
2d490 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
2d4a0 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
2d4b0 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
2d4c0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  /.  for(ii=0, pL
2d4d0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2d4e0 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2d4f0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2d500 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2d510 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
2d520 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
2d530 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
2d540 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
2d550 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
2d560 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
2d570 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d580 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
2d590 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
2d5a0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2d5b0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
2d5c0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2d5d0 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
2d5e0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2d5f0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
2d600 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
2d610 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2d620 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
2d630 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2d640 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
2d650 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2d660 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
2d670 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
2d680 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2d690 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2d6a0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
2d6b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2d6c0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2d6d0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
2d6e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
2d6f0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
2d700 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
2d710 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
2d720 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
2d730 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2d740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2d750 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2d760 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
2d770 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
2d780 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
2d790 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2d7a0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
2d7b0 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
2d7c0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2d7d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2d7e0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2d7f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2d800 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2d810 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2d820 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2d830 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
2d840 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ad;.      if( pW
2d850 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2d860 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2d870 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2d880 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2d890 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2d8a0 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62  nePass[0] = pTab
2d8b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2d8c0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71       };.      sq
2d8d0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
2d8e0 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
2d8f0 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
2d900 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
2d910 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
2d920 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65  ->iCursor==pLeve
2d930 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20  l->iTabCur );.  
2d940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
2d950 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2d960 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2d970 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
2d980 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2d990 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2d9a0 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2d9b0 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2d9c0 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
2d9d0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2d9e0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2d9f0 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
2da00 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54  S && HasRowid(pT
2da10 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42  ab) ){.        B
2da20 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
2da30 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
2da40 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
2da50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
2da60 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
2da70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2da80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2da90 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  -1, SQLITE_INT_T
2daa0 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
2dab0 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
2dac0 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
2dad0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ol );.      }.#i
2dae0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2daf0 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
2db00 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2db10 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
2db20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2db30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2db40 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2db50 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  EQ|bFordelete);.
2db60 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2db70 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2db80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2db90 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65  angeP5(v, bForde
2dba0 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lete);.      }.#
2dbb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2dbc0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2dbd0 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74  MASK.      sqlit
2dbe0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2dbf0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2dc00 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ed, pTabItem->iC
2dc10 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20  ursor, 0, 0,.   
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc30 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
2dc40 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63  u8*)&pTabItem->c
2dc50 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2dc60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
2dc70 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2dc80 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
2dc90 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
2dca0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
2dcb0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2dcc0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2dcd0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2dce0 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  ED ){.      Inde
2dcf0 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
2dd00 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2dd10 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
2dd20 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  Cur;.      int o
2dd30 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
2dd40 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72  .      /* iAuxAr
2dd50 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
2dd60 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
2dd70 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
2dd80 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
2dd90 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78      assert( iAux
2dda0 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Arg!=0 || (pWInf
2ddb0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2ddc0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2ddd0 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
2dde0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2ddf0 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
2de00 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
2de10 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
2de20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2de30 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a  R_SUBCLAUSE)!=0.
2de40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2de50 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20   /* This is one 
2de60 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70  term of an OR-op
2de70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67  timization using
2de80 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2de90 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   of a.        **
2dea0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2deb0 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66  able.  No need f
2dec0 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e  or a separate in
2ded0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  dex */.        i
2dee0 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65  IndexCur = pLeve
2def0 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20  l->iTabCur;.    
2df00 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20      op = 0;.    
2df10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e    }else if( pWIn
2df20 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
2df30 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
2df40 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d       Index *pJ =
2df50 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
2df60 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  >pIndex;.       
2df70 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2df80 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73  xArg;.        as
2df90 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
2dfa0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2dfb0 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20  _DESIRED );.    
2dfc0 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
2dfd0 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78  S(pJ) && pJ!=pIx
2dfe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49   ){.          iI
2dff0 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20  ndexCur++;.     
2e000 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e       pJ = pJ->pN
2e010 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
2e020 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2e030 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2e040 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2e050 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64  nePass[1] = iInd
2e060 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  exCur;.      }el
2e070 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26  se if( iAuxArg &
2e080 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2e090 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2e0a0 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)!=0 ){.      
2e0b0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
2e0c0 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f  uxArg;.        o
2e0d0 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  p = OP_ReopenIdx
2e0e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e0f0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2e100 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2e110 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
2e120 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2e130 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
2e140 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2e150 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2e160 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2e170 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
2e180 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ur>=0 );.      i
2e190 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  f( op ){.       
2e1a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e1b0 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
2e1c0 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
2e1d0 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
2e1e0 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
2e1f0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
2e200 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2e210 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2e220 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
2e230 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  NT)!=0.         
2e240 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2e250 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
2e260 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53  MN_RANGE|WHERE_S
2e270 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20  KIPSCAN))==0.   
2e280 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2e290 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
2e2a0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
2e2b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
2e2c0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e2d0 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  !=WHERE_DISTINCT
2e2e0 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20  _ORDERED.       
2e2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e300 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2e310 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2e320 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
2e330 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
2e340 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
2e350 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2e360 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
2e370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2e380 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2e390 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
2e3a0 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
2e3b0 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
2e3c0 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
2e3d0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2e3e0 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
2e3f0 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
2e400 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
2e410 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
2e420 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e430 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
2e440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e450 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
2e460 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
2e470 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
2e480 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
2e490 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
2e4a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2e4b0 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
2e4c0 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
2e4d0 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
2e4e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2e4f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2e500 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
2e510 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
2e520 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e540 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
2e550 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
2e560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
2e570 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
2e580 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2e590 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
2e5a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
2e5b0 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
2e5c0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2e5d0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
2e5e0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
2e5f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2e600 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
2e610 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2e620 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2e630 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
2e640 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
2e650 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
2e660 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
2e670 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
2e680 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
2e690 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2e6a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
2e6b0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
2e6c0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
2e6d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
2e6e0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
2e6f0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i++){.    int ad
2e700 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69  drExplain;.    i
2e710 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  nt wsFlags;.    
2e720 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
2e730 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46  ->a[ii];.    wsF
2e740 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  lags = pLevel->p
2e750 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
2e760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e770 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2e780 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
2e790 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
2e7a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
2e7b0 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
2e7c0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
2e7d0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
2e7e0 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
2e7f0 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
2e800 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
2e810 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
2e820 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2e830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
2e840 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e850 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2e860 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
2e870 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61  if.    addrExpla
2e880 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  in = sqlite3Wher
2e890 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28  eExplainOneScan(
2e8a0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
2e8b0 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
2e8c0 6c 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20  l, wctrlFlags.  
2e8d0 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d    );.    pLevel-
2e8e0 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69  >addrBody = sqli
2e8f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2e900 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65  dr(v);.    notRe
2e910 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ady = sqlite3Whe
2e920 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  reCodeOneLoopSta
2e930 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
2e940 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2e950 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2e960 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2e970 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46  nt;.    if( (wsF
2e980 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
2e990 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72  _OR)==0 && (wctr
2e9a0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f  lFlags&WHERE_OR_
2e9b0 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b  SUBCLAUSE)==0 ){
2e9c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
2e9d0 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
2e9e0 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
2e9f0 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
2ea00 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
2ea10 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
2ea20 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2ea30 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
2ea40 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
2ea50 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
2ea60 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
2ea70 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
2ea80 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
2ea90 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
2eaa0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
2eab0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2eac0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2ead0 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
2eae0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2eaf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2eb00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f  .}../*.** Part o
2eb10 66 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  f sqlite3WhereEn
2eb20 64 28 29 20 77 69 6c 6c 20 72 65 77 72 69 74 65  d() will rewrite
2eb30 20 6f 70 63 6f 64 65 73 20 74 6f 20 72 65 66 65   opcodes to refe
2eb40 72 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e 64  rence the.** ind
2eb50 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ex rather than t
2eb60 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
2eb70 49 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  In SQLITE_DEBUG 
2eb80 6d 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a 2a 2a  mode, we want.**
2eb90 20 74 6f 20 74 72 61 63 65 20 74 68 6f 73 65 20   to trace those 
2eba0 63 68 61 6e 67 65 73 20 69 66 20 50 52 41 47 4d  changes if PRAGM
2ebb0 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63  A vdbe_addoptrac
2ebc0 65 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  e=on.  This rout
2ebd0 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68 61 74  ine.** does that
2ebe0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2ebf0 49 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69  ITE_DEBUG.# defi
2ec00 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ne OpcodeRewrite
2ec10 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f 2a 20  Trace(D,K,P) /* 
2ec20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65 0a 23  no-op */.#else.#
2ec30 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65   define OpcodeRe
2ec40 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50  writeTrace(D,K,P
2ec50 29 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70  ) sqlite3WhereOp
2ec60 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
2ec70 28 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74 69 63  (D,K,P).  static
2ec80 20 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65   void sqlite3Whe
2ec90 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54  reOpcodeRewriteT
2eca0 72 61 63 65 28 0a 20 20 20 20 73 71 6c 69 74 65  race(.    sqlite
2ecb0 33 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74 20 70  3 *db,.    int p
2ecc0 63 2c 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  c,.    VdbeOp *p
2ecd0 4f 70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  Op.  ){.    if( 
2ece0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2ecf0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
2ed00 63 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ce)==0 ) return;
2ed10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ed20 50 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c 20 70  PrintOp(0, pc, p
2ed30 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Op);.  }.#endif.
2ed40 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2ed50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2ed60 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
2ed70 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
2ed80 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2ed90 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
2eda0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2edb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
2edc0 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
2edd0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
2ede0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2edf0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2ee00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2ee10 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2ee20 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
2ee30 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
2ee40 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
2ee50 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2ee60 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2ee70 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
2ee80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2ee90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
2eea0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
2eeb0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  code..  */.  Vdb
2eec0 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
2eed0 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f  v, "End WHERE-co
2eee0 72 65 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 70  re"));.  for(i=p
2eef0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
2ef00 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2ef10 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
2ef20 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2ef30 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2ef40 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2ef50 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  p;.    if( pLeve
2ef60 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
2ef70 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2ef80 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45  _DISABLE_SKIPAHE
2ef90 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  AD_DISTINCT.    
2efa0 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d    int addrSeek =
2efb0 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
2efc0 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  *pIdx;.      int
2efd0 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   n;.      if( pW
2efe0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2eff0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2f000 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26  ORDERED.       &
2f010 26 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  & i==pWInfo->nLe
2f020 76 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b 65 74  vel-1  /* Ticket
2f030 20 5b 65 66 39 33 31 38 37 35 37 62 31 35 32 65   [ef9318757b152e
2f040 33 5d 20 32 30 31 37 2d 31 30 2d 32 31 20 2a 2f  3] 2017-10-21 */
2f050 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
2f060 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2f070 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2f080 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d        && (pIdx =
2f090 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f0a0 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74  pIndex)->hasStat
2f0b0 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d  1.       && (n =
2f0c0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f0d0 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20 20  nIdxCol)>0.     
2f0e0 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77    && pIdx->aiRow
2f0f0 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20  LogEst[n]>=36.  
2f100 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2f110 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e  nt r1 = pParse->
2f120 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
2f130 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20  int j, op;.     
2f140 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2f150 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2f160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f170 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2f180 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2f190 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20  , j, r1+j);.    
2f1a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
2f1b0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b  arse->nMem += n+
2f1c0 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  1;.        op = 
2f1d0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50  pLevel->op==OP_P
2f1e0 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20  rev ? OP_SeekLT 
2f1f0 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20  : OP_SeekGT;.   
2f200 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20       addrSeek = 
2f210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f220 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76  4Int(v, op, pLev
2f230 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20  el->iIdxCur, 0, 
2f240 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  r1, n);.        
2f250 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2f260 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
2f270 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2f280 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2f290 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20  OP_SeekGT);.    
2f2a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f2b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2f2c0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  , 1, pLevel->p2)
2f2d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2f2e0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
2f2f0 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2f300 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f  TINCT */.      /
2f310 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
2f320 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  e: Advance to th
2f330 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  e next row */.  
2f340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f350 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2f360 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2f370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f380 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2f390 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2f3a0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2f3b0 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2f3c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2f3d0 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2f3e0 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2f3f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f400 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f410 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2f420 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2f430 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2f440 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2f450 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2f460 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2f470 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2f480 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64 65  P_VNext);.#ifnde
2f490 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2f4a0 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49  _SKIPAHEAD_DISTI
2f4b0 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61 64  NCT.      if( ad
2f4c0 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65 33  drSeek ) sqlite3
2f4d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2f4e0 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64 69  addrSeek);.#endi
2f4f0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2f500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2f510 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2f520 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2f530 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f540 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2f550 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2f560 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2f570 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2f580 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2f590 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2f5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f5b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2f5c0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2f5d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2f5e0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2f5f0 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2f600 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2f610 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2f620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f630 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2f640 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2f650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2f660 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2f670 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2f680 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 6e 50       if( pIn->nP
2f690 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20  refix ){.       
2f6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
2f6b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2f6c0 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20  ERE_IN_EARLYOUT 
2f6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2f6e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2f6f0 49 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f  Int(v, OP_IfNoHo
2f700 70 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  pe, pLevel->iIdx
2f710 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
2f740 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 0a  rrentAddr(v)+2,.
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2f770 6e 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d 3e 6e  n->iBase, pIn->n
2f780 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Prefix);.       
2f790 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f7a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
2f7b0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2f7c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f7d0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2f7e0 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
2f7f0 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
2f800 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2f810 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2f820 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2f830 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2f840 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  opOp==OP_Prev);.
2f850 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2f860 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2f870 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2f880 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Next);.        }
2f890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f8a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2f8b0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
2f8c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f8d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f8e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f8f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
2f900 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2f910 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20  ->addrSkip ){.  
2f920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2f930 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2f940 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2f950 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f960 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20  "next skip-scan 
2f970 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75  on %s", pLoop->u
2f980 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
2f990 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
2f9a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f9b0 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2f9c0 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71  rSkip);.      sq
2f9d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f9e0 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2f9f0 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a  rSkip-2);.    }.
2fa00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
2fa10 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
2fa20 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70  _BLOBS.    if( p
2fa30 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2fa40 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ep ){.      sqli
2fa50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fa60 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
2fa70 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e  , (int)(pLevel->
2fa80 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29  iLikeRepCntr>>1)
2fa90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2faa0 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
2fab0 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
2fac0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2fad0 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ge(v);.    }.#en
2fae0 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76  dif.    if( pLev
2faf0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2fb00 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
2fb10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
2fb20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
2fb30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2fb40 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
2fb50 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
2fb60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2fb70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2fb80 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
2fb90 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26  NLY)==0 || (ws &
2fba0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
2fbb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2fbc0 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
2fbd0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
2fbe0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
2fbf0 65 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70 54 61  el->iTabCur==pTa
2fc00 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2fc10 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20  >iFrom].iCursor 
2fc20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2fc30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2fc40 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
2fc50 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
2fc60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fc70 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2fc80 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  XED) .       || 
2fc90 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  ((ws & WHERE_MUL
2fca0 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c  TI_OR) && pLevel
2fcb0 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20  ->u.pCovidx) .  
2fcc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
2fcd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2fce0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
2fcf0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
2fd00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fd10 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
2fd20 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
2fd30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2fd50 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
2fd60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
2fd70 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
2fd80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fd90 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
2fda0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
2fdb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2fdc0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2fdd0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
2fde0 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65  }.    VdbeModule
2fdf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2fe00 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
2fe10 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  s", i,.         
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
2fe30 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2fe40 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70  pLevel->iFrom].p
2fe50 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2fe60 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
2fe70 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
2fe80 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
2fe90 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
2fea0 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
2feb0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
2fec0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2fed0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
2fee0 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72  Break);..  asser
2fef0 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
2ff00 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  l<=pTabList->nSr
2ff10 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  c );.  for(i=0, 
2ff20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2ff30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
2ff40 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  el; i++, pLevel+
2ff50 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c  +){.    int k, l
2ff60 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20  ast;.    VdbeOp 
2ff70 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20  *pOp;.    Index 
2ff80 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
2ff90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2ffa0 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
2ffb0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2ffc0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2ffd0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
2ffe0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
2fff0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
30000 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  0 );.    pLoop =
30010 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
30020 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63  ..    /* For a c
30030 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67  o-routine, chang
30040 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e all OP_Column 
30050 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
30060 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
30070 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  * the co-routine
30080 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66   into OP_Copy of
30090 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65   result containe
300a0 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  d in a register.
300b0 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64  .    ** OP_Rowid
300c0 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c   becomes OP_Null
300d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
300e0 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69   pTabItem->fg.vi
300f0 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
30100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
30110 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
30120 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
30130 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
30140 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c  oCopy(pParse, pL
30150 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
30160 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
30170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
30190 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
301a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  , 0);.      cont
301b0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
301c0 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e   /* If this scan
301d0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
301e0 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73  make VDBE code s
301f0 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20  ubstitutions to 
30200 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a  read data.    **
30210 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
30220 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20  instead of from 
30230 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20  the table where 
30240 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f  possible.  In so
30250 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20  me cases.    ** 
30260 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
30270 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74  n prevents the t
30280 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62  able from ever b
30290 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68  eing read, which
302a0 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c   can.    ** yiel
302b0 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20  d a significant 
302c0 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
302d0 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  t..    ** .    *
302e0 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
302f0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
30300 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
30310 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
30320 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
30330 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
30340 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
30350 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
30360 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
30370 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
30380 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
30390 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
303a0 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
303b0 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
303c0 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
303d0 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
303e0 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
303f0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
30400 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
30410 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
30420 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
30430 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f  E_INDEXED|WHERE_
30440 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
30450 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
30460 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
30470 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
30480 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
30490 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
304a0 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
304b0 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
304c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
304d0 70 49 64 78 0a 20 20 20 20 20 26 26 20 28 70 57  pIdx.     && (pW
304e0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
304f0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21  ONEPASS_OFF || !
30500 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
30510 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20  Table)).     && 
30520 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
30530 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c  d.    ){.      l
30540 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
30550 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
30560 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
30570 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 23 69 66  l->addrBody;.#if
30580 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
30590 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66  .      if( db->f
305a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
305b0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
305c0 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
305d0 54 52 41 4e 53 4c 41 54 45 20 6f 70 63 6f 64 65  TRANSLATE opcode
305e0 73 20 69 6e 20 72 61 6e 67 65 20 25 64 2e 2e 25  s in range %d..%
305f0 64 5c 6e 22 2c 20 6b 2c 20 6c 61 73 74 2d 31 29  d\n", k, last-1)
30600 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
30610 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
30620 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
30630 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b   k);.      for(;
30640 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
30650 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
30660 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
30670 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
30680 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
30690 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
306a0 4f 50 5f 43 6f 6c 75 6d 6e 0a 23 69 66 64 65 66  OP_Column.#ifdef
306b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
306c0 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20  FFSET_SQL_FUNC. 
306d0 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e          || pOp->
306e0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 66 66 73 65  opcode==OP_Offse
306f0 74 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  t.#endif.       
30700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
30710 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  t x = pOp->p2;. 
30720 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30730 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70   pIdx->pTable==p
30740 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab );.         
30750 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
30760 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
30770 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
30780 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
30790 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
307a0 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70             x = p
307b0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b  Pk->aiColumn[x];
307c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
307d0 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
307e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
307f0 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
30800 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
30810 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
30820 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
30830 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
30840 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = x;.           
30850 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
30860 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
30870 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
30880 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
30890 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
308a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
308b0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
308c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
308d0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e  X_ONLY)==0 || x>
308e0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
308f0 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e    || pWInfo->eOn
30900 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20  ePass );.       
30910 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
30920 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
30930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
30940 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
30950 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
30960 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
30970 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
30980 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
30990 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
309a0 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
309b0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
309c0 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c  pcode==OP_IfNull
309d0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
309e0 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
309f0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
30a00 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72        OpcodeRewr
30a10 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20  iteTrace(db, k, 
30a20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pOp);.        }.
30a30 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
30a40 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
30a50 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
30a60 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
30a70 6f 70 54 72 61 63 65 20 29 20 70 72 69 6e 74 66  opTrace ) printf
30a80 28 22 54 52 41 4e 53 4c 41 54 45 20 63 6f 6d 70  ("TRANSLATE comp
30a90 6c 65 74 65 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  lete\n");.#endif
30aa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
30ab0 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
30ac0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51   */.  pParse->nQ
30ad0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
30ae0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
30af0 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  op;.  whereInfoF
30b00 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
30b10 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.