/ Hex Artifact Content
Login

Artifact b33215cc1c69518b3c99a95cd8340eabd8e65213529e578659701401bfbcaa24:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 49 6e 20 74 68 65 20 4f 52 44 45 52 20  ** In the ORDER 
08e0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
08f0: 61 74 69 6f 6e 2c 20 69 66 20 74 68 65 20 69 6e  ation, if the in
0900: 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 73  ner-most loop is
0910: 20 6b 6e 6f 77 6e 0a 2a 2a 20 74 6f 20 65 6d 69   known.** to emi
0920: 74 20 72 6f 77 73 20 69 6e 20 69 6e 63 72 65 61  t rows in increa
0930: 73 69 6e 67 20 6f 72 64 65 72 2c 20 61 6e 64 20  sing order, and 
0940: 69 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  if the last row 
0950: 65 6d 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a  emitted by the.*
0960: 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  * inner-most loo
0970: 70 20 64 69 64 20 6e 6f 74 20 66 69 74 20 77 69  p did not fit wi
0980: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  thin the sorter,
0990: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 73 6b 69   then we can ski
09a0: 70 20 61 6c 6c 0a 2a 2a 20 73 75 62 73 65 71 75  p all.** subsequ
09b0: 65 6e 74 20 72 6f 77 73 20 66 6f 72 20 74 68 65  ent rows for the
09c0: 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69   current iterati
09d0: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  on of the inner 
09e0: 6c 6f 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  loop (because th
09f0: 65 79 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  ey.** will not f
0a00: 69 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  it in the sorter
0a10: 20 65 69 74 68 65 72 29 20 61 6e 64 20 63 6f 6e   either) and con
0a20: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 73  tinue with the s
0a30: 65 63 6f 6e 64 20 69 6e 6e 65 72 0a 2a 2a 20 6c  econd inner.** l
0a40: 6f 6f 70 20 2d 20 74 68 65 20 6c 6f 6f 70 20 69  oop - the loop i
0a50: 6d 6d 65 64 69 61 74 65 6c 79 20 6f 75 74 73 69  mmediately outsi
0a60: 64 65 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  de the inner-mos
0a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  t..**.** When a 
0a80: 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  row does not fit
0a90: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 28   in the sorter (
0aa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 6f 72 74  because the sort
0ab0: 65 72 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  er already.** ho
0ac0: 6c 64 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  lds LIMIT+OFFSET
0ad0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 73   rows that are s
0ae0: 6d 61 6c 6c 65 72 29 2c 20 74 68 65 6e 20 61 20  maller), then a 
0af0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
0b00: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 72 65 74  the.** label ret
0b10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
0b20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
0b30: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
0b40: 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  MIT optimization
0b50: 20 61 70 70 6c 69 65 73 2c 20 74 68 65 20 6a 75   applies, the ju
0b60: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73  mp destination s
0b70: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20  hould.** be the 
0b80: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72  continuation for
0b90: 20 74 68 65 20 73 65 63 6f 6e 64 2d 69 6e 6e 65   the second-inne
0ba0: 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20 20 49 66  r-most loop.  If
0bb0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
0bc0: 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74   LIMIT optimizat
0bd0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ion does not app
0be0: 6c 79 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ly, then the jum
0bf0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 68  p destination sh
0c00: 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20 63  ould.** be the c
0c10: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72 20  ontinuation for 
0c20: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
0c30: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  oop..**.** It is
0c40: 20 61 6c 77 61 79 73 20 73 61 66 65 20 66 6f 72   always safe for
0c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
0c60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74   return the cont
0c70: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  inuation of the.
0c80: 2a 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  ** inner-most lo
0c90: 6f 70 2c 20 69 6e 20 74 68 65 20 73 65 6e 73 65  op, in the sense
0ca0: 20 74 68 61 74 20 61 20 63 6f 72 72 65 63 74 20   that a correct 
0cb0: 61 6e 73 77 65 72 20 77 69 6c 6c 20 72 65 73 75  answer will resu
0cc0: 6c 74 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 69  lt.  .** Returni
0cd0: 6e 67 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ng the continuat
0ce0: 69 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ion the second i
0cf0: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 61 6e 20  nner loop is an 
0d00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0d10: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 6b 65 20  that might make 
0d20: 74 68 65 20 63 6f 64 65 20 72 75 6e 20 61 20 6c  the code run a l
0d30: 69 74 74 6c 65 20 66 61 73 74 65 72 2c 20 62 75  ittle faster, bu
0d40: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  t should not cha
0d50: 6e 67 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  nge.** the final
0d60: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
0d70: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
0d80: 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c  rByLimitOptLabel
0d90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0da0: 66 6f 29 7b 0a 20 20 57 68 65 72 65 4c 65 76 65  fo){.  WhereLeve
0db0: 6c 20 2a 70 49 6e 6e 65 72 3b 0a 20 20 69 66 28  l *pInner;.  if(
0dc0: 20 21 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72   !pWInfo->bOrder
0dd0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
0de0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
0df0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
0e00: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
0e10: 70 70 6c 79 2e 20 20 4a 75 6d 70 20 74 6f 20 74  pply.  Jump to t
0e20: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 69  he .    ** conti
0e30: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  nuation of the i
0e40: 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20  nner-most loop. 
0e50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 57  */.    return pW
0e60: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
0e70: 0a 20 20 7d 0a 20 20 70 49 6e 6e 65 72 20 3d 20  .  }.  pInner = 
0e80: 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66  &pWInfo->a[pWInf
0e90: 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 3b 0a 20 20  o->nLevel-1];.  
0ea0: 61 73 73 65 72 74 28 20 70 49 6e 6e 65 72 2d 3e  assert( pInner->
0eb0: 61 64 64 72 4e 78 74 21 3d 30 20 29 3b 0a 20 20  addrNxt!=0 );.  
0ec0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ed0: 64 64 72 4e 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrNxt;.}../*.**
0ee0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0ef0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f00: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f10: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f20: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f30: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f40: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f50: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f60: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f70: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f80: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0f90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fa0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fb0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fc0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0fe0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
0ff0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1000: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1010: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1020: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1030: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1040: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1050: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1060: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1070: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1080: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
1090: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10b0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10c0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10d0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
10f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1100: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1110: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1140: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1150: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1160: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1170: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1180: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
1190: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11b0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11c0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11d0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11e0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
11f0: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1200: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1210: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1220: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1230: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1240: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1250: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1260: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1270: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1280: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
1290: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12a0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12b0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12c0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12d0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
12f0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1300: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1310: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1320: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1330: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1340: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1350: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1360: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1370: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1380: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
1390: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13a0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13d0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
13f0: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1400: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1410: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1420: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1430: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1440: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1450: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1460: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1470: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1480: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
1490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14a0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14c0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14d0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14e0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
14f0: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1500: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1510: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1520: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1530: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1540: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1560: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1570: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1580: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
1590: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15a0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15b0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15c0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15d0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15e0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
15f0: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1600: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1610: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1620: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1630: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1640: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1650: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1660: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1670: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1680: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
1690: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16a0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16b0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16c0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16d0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16e0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
16f0: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1700: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1710: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1720: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1730: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1740: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1750: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1760: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1770: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1780: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
1790: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17a0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17b0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17c0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17d0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17e0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
17f0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1810: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1820: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1830: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1840: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1850: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1860: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1870: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1880: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
1890: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18a0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18b0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18c0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18d0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18e0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
18f0: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1900: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1910: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1930: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1940: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1950: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1960: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1970: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1990: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19a0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19d0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19e0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
19f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a00: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a10: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a20: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a30: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a40: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a50: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a60: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a70: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1a90: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1aa0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ab0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ac0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ad0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1ae0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1af0: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b00: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b30: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b40: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b50: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b60: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b70: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1b90: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1ba0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bc0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1be0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1bf0: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c00: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c10: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c20: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c40: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c50: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c70: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c80: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1c90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1ca0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cb0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cc0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1cd0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1ce0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1cf0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d00: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d10: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d20: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d40: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d50: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d60: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d70: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d80: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1da0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1db0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dc0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1dd0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1de0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1df0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e00: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e10: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e20: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e30: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e40: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e50: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e70: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e80: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1e90: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ec0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ed0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ee0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1ef0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f00: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f10: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f20: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f40: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f50: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f60: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f70: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f80: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1f90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fa0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fb0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fc0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fd0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1fe0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
1ff0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2000: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2010: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2020: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2030: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2050: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2060: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2070: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2080: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
2090: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20a0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20b0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20c0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20d0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20e0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
20f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2110: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2120: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2130: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2140: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2150: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2170: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2180: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
2190: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21c0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21d0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21e0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
21f0: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2200: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2210: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2220: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2250: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2260: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2270: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2280: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
2290: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22a0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
22c0: 64 4c 69 6b 65 6c 79 28 70 54 65 72 6d 2d 3e 70  dLikely(pTerm->p
22d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
22e0: 6f 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  op.             
22f0: 20 20 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20    ==TK_COLUMN.  
2300: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2310: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
2320: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2330: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
2340: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
2350: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
2360: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
2370: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
2380: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
2390: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
23a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
23c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23f0: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
2400: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
2410: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
2420: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
2430: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
2440: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
2450: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
2460: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2470: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
2480: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2490: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24a0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
24b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
24c0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
24d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24e0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
24f0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
2500: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
2510: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2520: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
2530: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
2540: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2550: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
2570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
2590: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
25a0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
25b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
25c0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
25d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25e0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
25f0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
2600: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2620: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2640: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2650: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
2660: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2670: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2680: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2690: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
26d0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26f0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
2700: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2710: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2720: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2730: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
2740: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
2750: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
2760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2770: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2780: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27a0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
27b0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
27c0: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
27e0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
27f0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
2800: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
2810: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
2820: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
2830: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
2840: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
2850: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
2860: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
2870: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2880: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2890: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28a0: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
28b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28d0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
28e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20  ->pWC = pWC;.   
28f0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2900: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
2910: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
2920: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
2930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2940: 0a 20 20 20 20 20 20 70 57 43 20 3d 20 70 57 43  .      pWC = pWC
2950: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
2960: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2970: 65 28 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20  e( pWC!=0 );.   
2980: 20 69 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75   if( pScan->iEqu
2990: 69 76 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv>=pScan->nEqui
29a0: 76 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  v ) break;.    p
29b0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69  WC = pScan->pOri
29c0: 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a  gWC;.    k = 0;.
29d0: 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69      pScan->iEqui
29e0: 76 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  v++;.  }.  retur
29f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2a00: 69 73 20 69 73 20 77 68 65 72 65 53 63 61 6e 49  is is whereScanI
2a10: 6e 69 74 28 29 20 66 6f 72 20 74 68 65 20 63 61  nit() for the ca
2a20: 73 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 6f  se of an index o
2a30: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
2a40: 0a 2a 2a 20 49 74 20 69 73 20 66 61 63 74 6f 72  .** It is factor
2a50: 65 64 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  ed out into a se
2a60: 70 61 72 61 74 65 20 74 61 69 6c 2d 72 65 63 75  parate tail-recu
2a70: 72 73 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  rsion subroutine
2a80: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20   so that.** the 
2a90: 6e 6f 72 6d 61 6c 20 77 68 65 72 65 53 63 61 6e  normal whereScan
2aa0: 49 6e 69 74 28 29 20 72 6f 75 74 69 6e 65 2c 20  Init() routine, 
2ab0: 77 68 69 63 68 20 69 73 20 61 20 68 69 67 68 2d  which is a high-
2ac0: 72 75 6e 6e 65 72 2c 20 64 6f 65 73 20 6e 6f 74  runner, does not
2ad0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 70 75 73 68  .** need to push
2ae0: 20 72 65 67 69 73 74 65 72 73 20 6f 6e 74 6f 20   registers onto 
2af0: 74 68 65 20 73 74 61 63 6b 20 61 73 20 70 61 72  the stack as par
2b00: 74 20 6f 66 20 69 74 73 20 70 72 6f 6c 6f 67 75  t of its prologu
2b10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
2b20: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 57 68 65  ITE_NOINLINE Whe
2b30: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
2b40: 6e 49 6e 69 74 49 6e 64 65 78 45 78 70 72 28 57  nInitIndexExpr(W
2b50: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29  hereScan *pScan)
2b60: 7b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66  {.  pScan->idxaf
2b70: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2b80: 66 66 69 6e 69 74 79 28 70 53 63 61 6e 2d 3e 70  ffinity(pScan->p
2b90: 49 64 78 45 78 70 72 29 3b 0a 20 20 72 65 74 75  IdxExpr);.  retu
2ba0: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
2bb0: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
2bc0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2bd0: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
2be0: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
2bf0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2c00: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2c10: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
2c20: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
2c30: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
2c40: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
2c50: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
2c60: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c70: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2c80: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2ca0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2cb0: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2cc0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2cd0: 2a 20 69 43 75 72 2e 20 20 20 4f 72 20 69 66 20  * iCur.   Or if 
2ce0: 70 49 64 78 21 3d 30 20 74 68 65 6e 20 58 20 69  pIdx!=0 then X i
2cf0: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
2d00: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 20   of index pIdx. 
2d10: 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74 20 62 65   pIdx.** must be
2d20: 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
2d30: 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75  xes of table iCu
2d40: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6f 70  r..**.** The <op
2d50: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2d60: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2d70: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2d80: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
2d90: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
2da0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
2db0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
2dc0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
2dd0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
2de0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2df0: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2e00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2e10: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2e20: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2e30: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2e40: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2e50: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2e60: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2e70: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2e80: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
2e90: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
2ea0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
2eb0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2ec0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
2ed0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
2ee0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2ef0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2f00: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2f10: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2f20: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2f30: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2f40: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2f50: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2f60: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2f70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2f80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
2f90: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
2fa0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2fb0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2fc0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
2fd0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
2fe0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2ff0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
3000: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
3010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
3020: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
3030: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
3040: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
3050: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3060: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3070: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 70   index */.){.  p
3080: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
3090: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
30a0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
30b0: 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a  ->pIdxExpr = 0;.
30c0: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
30d0: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 7a 43  = 0;.  pScan->zC
30e0: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ollName = 0;.  p
30f0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
3100: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
3110: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
3120: 61 69 43 75 72 5b 30 5d 20 3d 20 69 43 75 72 3b  aiCur[0] = iCur;
3130: 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  .  pScan->nEquiv
3140: 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e 2d 3e 69   = 1;.  pScan->i
3150: 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 69 66 28  Equiv = 1;.  if(
3160: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
3170: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
3180: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
3190: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
31a0: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
31b0: 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20  XN_EXPR ){.     
31c0: 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72   pScan->pIdxExpr
31d0: 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70   = pIdx->aColExp
31e0: 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  r->a[j].pExpr;. 
31f0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c       pScan->zCol
3200: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
3210: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 70  Coll[j];.      p
3220: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  Scan->aiColumn[0
3230: 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
3240: 20 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53     return whereS
3250: 63 61 6e 49 6e 69 74 49 6e 64 65 78 45 78 70 72  canInitIndexExpr
3260: 28 70 53 63 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  (pScan);.    }el
3270: 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d  se if( iColumn==
3280: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  pIdx->pTable->iP
3290: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  Key ){.      iCo
32a0: 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
32b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
32c0: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
32d0: 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66     pScan->idxaff
32e0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
32f0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
3300: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 70  ffinity;.      p
3310: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3320: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
3330: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
3340: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
3350: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 72 65 74  _EXPR ){.    ret
3360: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  urn 0;.  }.  pSc
3370: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
3380: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 72 65 74  = iColumn;.  ret
3390: 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78  urn whereScanNex
33a0: 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pScan);.}../*.
33b0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  ** Search for a 
33c0: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
33d0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
33e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
33f0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
3400: 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66  where X is a ref
3410: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43  erence to the iC
3420: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
3430: 43 75 72 20 6f 72 20 6f 66 20 69 6e 64 65 78 20  Cur or of index 
3440: 70 49 64 78 0a 2a 2a 20 69 66 20 70 49 64 78 21  pIdx.** if pIdx!
3450: 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  =0 and <op> is o
3460: 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f 78 78 20  ne of the WO_xx 
3470: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
3480: 70 65 63 69 66 69 65 64 20 62 79 0a 2a 2a 20 74  pecified by.** t
3490: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
34a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
34b0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
34c0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
34d0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
34e0: 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20 69 74   pIdx!=0 then it
34f0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
3500: 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  the indexes of t
3510: 61 62 6c 65 20 69 43 75 72 2e 20 20 0a 2a 2a 20  able iCur.  .** 
3520: 53 65 61 72 63 68 20 66 6f 72 20 74 65 72 6d 73  Search for terms
3530: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 43   matching the iC
3540: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3550: 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61 74 68 65  of pIdx.** rathe
3560: 72 20 74 68 61 6e 20 74 68 65 20 69 43 6f 6c 75  r than the iColu
3570: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  mn-th column of 
3580: 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a  table iCur..**.*
3590: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
35a0: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
35b0: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
35c0: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
35d0: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
35e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
35f0: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
3600: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
3610: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
3620: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
3630: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
3640: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
3650: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
3660: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 69 43 75  ld.  The.** aiCu
3670: 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b 5d 20 61  r[]/iaColumn[] a
3680: 72 72 61 79 73 20 68 6f 6c 64 20 58 20 61 6e 64  rrays hold X and
3690: 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c   all its equival
36a0: 65 6e 74 73 2e 20 54 68 65 72 65 20 61 72 65 20  ents. There are 
36b0: 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69 6e 20 61  11.** slots in a
36c0: 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75 6d 6e 5b  iCur[]/aiColumn[
36d0: 5d 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  ] so that means 
36e0: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
36f0: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 0a  X plus up to 10.
3700: 2a 2a 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  ** other equival
3710: 65 6e 74 20 76 61 6c 75 65 73 2e 20 20 48 65 6e  ent values.  Hen
3720: 63 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  ce a search for 
3730: 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65  X will return <e
3740: 78 70 72 3e 20 69 66 20 58 3d 41 31 0a 2a 2a 20  xpr> if X=A1.** 
3750: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
3760: 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20  =A3 and ... and 
3770: 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c  A9=A10 and A10=<
3780: 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  expr>..**.** If 
3790: 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70  there are multip
37a0: 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
37b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
37c0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
37d0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e   <expr>".** then
37e0: 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65   try for the one
37f0: 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65   with no depende
3800: 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20  ncies on <expr> 
3810: 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  - in other words
3820: 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e   where.** <expr>
3830: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
3840: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d  xpression of som
3850: 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65  e kind.  Only re
3860: 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a  turn entries of.
3870: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
3880: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69  op> Y" where Y i
3890: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e  s a column in an
38a0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e  other table if n
38b0: 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68  o terms of.** th
38c0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
38d0: 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69  const-expr>" exi
38e0: 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d  st.   If no term
38f0: 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  s with a constan
3900: 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20  t RHS.** exist, 
3910: 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20  try to return a 
3920: 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e  term that does n
3930: 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e  ot use WO_EQUIV.
3940: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 73  .*/.WhereTerm *s
3950: 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
3960: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
3970: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
3980: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3990: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
39a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
39b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
39c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
39d0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
39e0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
39f0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3a00: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
3a10: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
3a20: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
3a30: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
3a40: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
3a50: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3a60: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
3a70: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
3a80: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
3a90: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
3aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
3ab0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
3ac0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
3ad0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
3ae0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
3af0: 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57  pResult = 0;.  W
3b00: 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57  hereTerm *p;.  W
3b10: 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a  hereScan scan;..
3b20: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49    p = whereScanI
3b30: 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20  nit(&scan, pWC, 
3b40: 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f  iCur, iColumn, o
3b50: 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f 70 20 26  p, pIdx);.  op &
3b60: 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 3b 0a 20  = WO_EQ|WO_IS;. 
3b70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
3b80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
3b90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3bb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
3bc0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
3bd0: 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b 0a 20 20  tor&op)!=0 ){.  
3be0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3bf0: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  p->eOperator & W
3c00: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
3c10: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20  return p;.      
3c20: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  }.      if( pRes
3c30: 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74  ult==0 ) pResult
3c40: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
3c50: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  p = whereScanNex
3c60: 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20  t(&scan);.  }.  
3c70: 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a  return pResult;.
3c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3c90: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
3ca0: 70 4c 69 73 74 20 66 6f 72 20 61 6e 20 65 6e 74  pList for an ent
3cb0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
3cc0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
3cd0: 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70  mn.** of index p
3ce0: 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
3cf0: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
3d00: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
3d10: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
3d20: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
3d30: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
3d40: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
3d50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
3d70: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
3d80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3da0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3db0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
3dc0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3dd0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3de0: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
3df0: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
3e20: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
3e30: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
3e40: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
3e70: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
3e80: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
3eb0: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
3ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
3ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
3ee0: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
3ef0: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
3f00: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
3f10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
3f20: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
3f30: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
3f40: 64 4c 69 6b 65 6c 79 28 70 4c 69 73 74 2d 3e 61  dLikely(pList->a
3f50: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
3f60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
3f70: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
3f80: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
3f90: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
3fa0: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
3fb0: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
3fc0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3fd0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
3fe0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
3ff0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4000: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
4010: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
4020: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
4030: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
4040: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
4050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4060: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
4070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4080: 20 69 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   if the iCol-th 
4090: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
40a0: 70 49 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c  pIdx is NOT NULL
40b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
40c0: 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
40d0: 6c 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  l(Index *pIdx, i
40e0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
40f0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  j;.  assert( pId
4100: 78 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x!=0 );.  assert
4110: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
4120: 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  l<pIdx->nColumn 
4130: 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61  );.  j = pIdx->a
4140: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20  iColumn[iCol];. 
4150: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
4160: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54   return pIdx->pT
4170: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  able->aCol[j].no
4180: 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  tNull;.  }else i
4190: 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( j==(-1) ){.  
41a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
41c0: 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20   j==(-2) );.    
41d0: 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73  return 0;  /* As
41e0: 73 75 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20  sume an indexed 
41f0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61  expression can a
4200: 6c 77 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55  lways yield a NU
4210: 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a  LL */..  }.}../*
4220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
4230: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4240: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
4250: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68  passed as the th
4260: 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ird argument.** 
4270: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a  is redundant..**
4280: 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c  .** A DISTINCT l
4290: 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
42a0: 20 69 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f   if any subset o
42b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
42c0: 20 74 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54   the.** DISTINCT
42d0: 20 6c 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63   list are collec
42e0: 74 69 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e  tively unique an
42f0: 64 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e  d individually n
4300: 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  on-null..*/.stat
4310: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
4320: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
4330: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4340: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
4350: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4360: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
4370: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t,        /* The
4380: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
4390: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
43a0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  WC,         /* T
43b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
43c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
43d0: 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f  Distinct       /
43e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
43f0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
4400: 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b  e DISTINCT */.){
4410: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
4420: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
4430: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a   .  int iBase;..
4460: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4470: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
4480: 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65  able or sub-sele
4490: 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
44a0: 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68  lause of.  ** th
44b0: 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
44c0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
44d0: 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74  ssible to show t
44e0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
44f0: 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73   .  ** clause is
4500: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
4510: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
4520: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
4530: 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61  0;.  iBase = pTa
4540: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
4550: 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54  sor;.  pTab = pT
4560: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
4570: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  b;..  /* If any 
4580: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
4590: 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c  ns is an IPK col
45a0: 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61  umn on table iBa
45b0: 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  se, then return 
45c0: 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65  .  ** true. Note
45d0: 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65  : The (p->iTable
45e0: 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66  ==iBase) part of
45f0: 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62   this test may b
4600: 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20  e false if the. 
4610: 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45   ** current SELE
4620: 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  CT is a correlat
4630: 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  ed sub-query..  
4640: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
4650: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
4660: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
4670: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
4680: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
4690: 69 6b 65 6c 79 28 70 44 69 73 74 69 6e 63 74 2d  ikely(pDistinct-
46a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46b0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
46c0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
46d0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
46e0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
46f0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
4700: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
4710: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
4720: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
4730: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
4740: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
4750: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4760: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
4770: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
4780: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
4790: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
47a0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
47b0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
47c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
47d0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
47e0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
47f0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
4800: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
4810: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
4820: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4830: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
4840: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
4850: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
4860: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
4870: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
4880: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
4890: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
48a0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
48b0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
48c0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
48d0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
48e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
48f0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
4900: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
4910: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
4920: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
4930: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
4940: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
4950: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
4960: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
4970: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
4980: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
4990: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
49a0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
49b0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
49c0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
49d0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
49e0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
49f0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
4a00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
4a10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
4a20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
4a30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
4a40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
4a50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
4a60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
4a70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
4a80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
4a90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
4aa0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
4ab0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
4ac0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4ad0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
4ae0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
4af0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
4b00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
4b10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4b20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
4b30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
4b40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
4b50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
4b60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
4b70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
4b80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
4b90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
4ba0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
4bb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
4bc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
4bd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
4be0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
4bf0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4c00: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4c10: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4c20: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4c30: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4c40: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4c50: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4c60: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4c70: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4c80: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4c90: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
4ca0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
4cb0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
4cc0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
4cd0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
4ce0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
4cf0: 20 49 66 20 74 68 65 20 69 41 75 74 6f 69 64 78   If the iAutoidx
4d00: 43 75 72 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  Cur is not zero,
4d10: 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77   then any OP_Row
4d20: 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  id instructions 
4d30: 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54 61  on.** cursor iTa
4d40: 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66 6f  bCur are transfo
4d50: 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 53 65 71  rmed into OP_Seq
4d60: 75 65 6e 63 65 20 6f 70 63 6f 64 65 20 66 6f 72  uence opcode for
4d70: 20 74 68 65 0a 2a 2a 20 69 41 75 74 6f 69 64 78   the.** iAutoidx
4d80: 43 75 72 20 63 75 72 73 6f 72 2c 20 69 6e 20 6f  Cur cursor, in o
4d90: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
4da0: 20 75 6e 69 71 75 65 20 72 6f 77 69 64 73 20 66   unique rowids f
4db0: 6f 72 20 74 68 65 0a 2a 2a 20 61 75 74 6f 6d 61  or the.** automa
4dc0: 74 69 63 20 69 6e 64 65 78 20 62 65 69 6e 67 20  tic index being 
4dd0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74  generated..*/.st
4de0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4df0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4e00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4e10: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4e20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
4e30: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4e40: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4e50: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
4e60: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
4e70: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
4e80: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4e90: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4ea0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4eb0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4ec0: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4ed0: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4ee0: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4ef0: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 41  ster */.  int iA
4f00: 75 74 6f 69 64 78 43 75 72 20 20 20 20 20 2f 2a  utoidxCur     /*
4f10: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 75   If non-zero, cu
4f20: 72 73 6f 72 20 6f 66 20 61 75 74 6f 69 6e 64 65  rsor of autoinde
4f30: 78 20 62 65 69 6e 67 20 67 65 6e 65 72 61 74 65  x being generate
4f40: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
4f50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4f60: 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  e;.  VdbeOp *pOp
4f70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4f80: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4f90: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4fa0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4fb0: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50  ddr(v);.  if( pP
4fc0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4fd0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4fe0: 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c  .  for(; iStart<
4ff0: 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20  iEnd; iStart++, 
5000: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pOp++){.    if( 
5010: 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72  pOp->p1!=iTabCur
5020: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5030: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5040: 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
5050: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
5060: 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20   = OP_Copy;.    
5070: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d    pOp->p1 = pOp-
5080: 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b  >p2 + iRegister;
5090: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
50a0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
50b0: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20  pOp->p3 = 0;.   
50c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
50d0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
50e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 41   ){.      if( iA
50f0: 75 74 6f 69 64 78 43 75 72 20 29 7b 0a 20 20 20  utoidxCur ){.   
5100: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
5110: 20 3d 20 4f 50 5f 53 65 71 75 65 6e 63 65 3b 0a   = OP_Sequence;.
5120: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
5130: 3d 20 69 41 75 74 6f 69 64 78 43 75 72 3b 0a 20  = iAutoidxCur;. 
5140: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5150: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
5160: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
5170: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
5180: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
5190: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
51a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
51b0: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
51c0: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
51d0: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
51e0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
51f0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
5200: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
5210: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
5220: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
5230: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
5240: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
5250: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
5260: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
5270: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
5280: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5290: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
52a0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
52b0: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
52c0: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
52d0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
52e0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
52f0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
5300: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
5310: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
5320: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5330: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
5340: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
5350: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5360: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
5370: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
5380: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
5390: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
53a0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
53b0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
53c0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
53d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
53e0: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
53f0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
5400: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
5410: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
5420: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
5430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5440: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
5450: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5460: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
5470: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
5480: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
5490: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
54a0: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
54b0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
54c0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
54d0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
54e0: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
54f0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
5500: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
5510: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
5520: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
5530: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5540: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
5550: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
5560: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5570: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
5580: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
5590: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
55a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
55b0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
55c0: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
55d0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
55e0: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
55f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
5600: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
5610: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
5620: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
5630: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
5640: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
5650: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
5660: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
5670: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
5680: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
5690: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
56a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56b0: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
56c0: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
56d0: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
56e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56f0: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
5700: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
5710: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
5720: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
5730: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
5740: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
5750: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
5760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
5770: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5780: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
5790: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
57a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
57b0: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
57c0: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
57d0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
57e0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
57f0: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
5800: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
5810: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
5820: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
5830: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
5840: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
5850: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5870: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
5880: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
5890: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58a0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
58b0: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
58c0: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
58d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
58e0: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
58f0: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
5900: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
5910: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
5920: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
5930: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
5940: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
5950: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5960: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
5970: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
5980: 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _IS))==0 ) retur
5990: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 72 63  n 0;.  if( (pSrc
59a0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
59b0: 4a 54 5f 4c 45 46 54 29 20 0a 20 20 20 26 26 20  JT_LEFT) .   && 
59c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
59d0: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
59e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26  P_FromJoin).   &
59f0: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
5a00: 74 6f 72 20 26 20 57 4f 5f 49 53 29 0a 20 20 29  tor & WO_IS).  )
5a10: 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  {.    /* Cannot 
5a20: 75 73 65 20 61 6e 20 49 53 20 74 65 72 6d 20 66  use an IS term f
5a30: 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c  rom the WHERE cl
5a40: 61 75 73 65 20 61 73 20 61 6e 20 69 6e 64 65 78  ause as an index
5a50: 20 64 72 69 76 65 72 20 66 6f 72 0a 20 20 20 20   driver for.    
5a60: 2a 2a 20 74 68 65 20 52 48 53 20 6f 66 20 61 20  ** the RHS of a 
5a70: 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 75 63 68 20  LEFT JOIN. Such 
5a80: 61 20 74 65 72 6d 20 63 61 6e 20 6f 6e 6c 79 20  a term can only 
5a90: 62 65 20 75 73 65 64 20 69 66 20 69 74 20 69 73  be used if it is
5aa0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
5ab0: 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a   ON clause.  */.
5ac0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5ad0: 7d 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  }.  if( (pTerm->
5ae0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
5af0: 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
5b00: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
5b10: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5b20: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
5b30: 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
5b40: 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
5b50: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
5b60: 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
5b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5b80: 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
5b90: 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
5ba0: 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   0;.  testcase( 
5bb0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
5bc0: 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65 74  ==TK_IS );.  ret
5bd0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
5be0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5bf0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
5c00: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
5c10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
5c20: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
5c30: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
5c40: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
5c50: 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
5c60: 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
5c70: 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
5c80: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
5c90: 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
5ca0: 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
5cb0: 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
5cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
5cd0: 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
5ce0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
5cf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
5d00: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5d10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
5d20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
5d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5d40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5d50: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5d60: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
5d70: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
5d80: 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
5d90: 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
5da0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
5db0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
5dc0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
5dd0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
5de0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
5df0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
5e10: 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
5e20: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b  e */.){.  int nK
5e30: 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
5e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5e50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
5e60: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
5e70: 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
5e80: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
5e90: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
5ea0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
5eb0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
5ec0: 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
5ed0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
5ee0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
5ef0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f10: 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
5f20: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
5f30: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
5f40: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
5f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
5f60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
5f70: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5f80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
5f90: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
5fa0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5fb0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
5fc0: 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
5fd0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
5fe0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
5ff0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
6000: 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
6010: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6030: 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
6040: 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
6050: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6070: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
6080: 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
6090: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
60c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
60f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
6100: 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
6110: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
6120: 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
6130: 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
6140: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
6150: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
6160: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
6170: 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
6180: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
6190: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
61a0: 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
61b0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  t */.  char *zNo
61c0: 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  tUsed;          
61d0: 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
61e0: 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  e on the end of 
61f0: 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  pIdx */.  Bitmas
6200: 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
6210: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
6220: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
6230: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
6240: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
6250: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
6260: 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
6270: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
6280: 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e  .  u8 sentWarnin
6290: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
62a0: 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e  * True if a warn
62b0: 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73  ning has been is
62c0: 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sued */.  Expr *
62d0: 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20 20  pPartial = 0;   
62e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61 6c        /* Partial
62f0: 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69 6f   Index Expressio
6300: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  n */.  int iCont
6310: 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20 20  inue = 0;       
6320: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
6330: 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65 64  to skip excluded
6340: 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75 63   rows */.  struc
6350: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
6360: 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
6370: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
6380: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
6390: 20 20 69 6e 74 20 61 64 64 72 43 6f 75 6e 74 65    int addrCounte
63a0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  r = 0;        /*
63b0: 20 41 64 64 72 65 73 73 20 77 68 65 72 65 20 69   Address where i
63c0: 6e 74 65 67 65 72 20 63 6f 75 6e 74 65 72 20 69  nteger counter i
63d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  s initialized */
63e0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6400: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
6410: 74 65 72 73 20 77 68 65 72 65 20 72 65 63 6f 72  ters where recor
6420: 64 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20 2a  d is assembled *
6430: 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
6440: 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
6450: 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
6460: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
6470: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
6480: 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
6490: 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
64a0: 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
64b0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
64c0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
64d0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
64e0: 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69  !=0 );.  addrIni
64f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
6500: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
6510: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6520: 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  v);..  /* Count 
6530: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6540: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
6550: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
6560: 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
6570: 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
6580: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
6590: 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43  aints */.  nKeyC
65a0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
65b0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
65c0: 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
65d0: 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
65e0: 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
65f0: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
6600: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
6610: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
6620: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
6630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
6640: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
6650: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
6660: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
6670: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
6680: 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65  oin)    /* prere
6690: 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72  q always non-zer
66a0: 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c  o */.         ||
66b0: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
66c0: 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  inTable!=pSrc->i
66d0: 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f  Cursor   /*   fo
66e0: 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  r the right-hand
66f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c     */.         |
6700: 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21  | pLoop->prereq!
6710: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
6720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74            /*   t
6730: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
6740: 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  OIN */.    if( p
6750: 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a  Loop->prereq==0.
6760: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
6770: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
6780: 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20  IRTUAL)==0.     
6790: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
67a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
67b0: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20  omJoin).     && 
67c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
67d0: 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  leConstant(pExpr
67e0: 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
67f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69   ){.      pParti
6800: 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
6810: 41 6e 64 28 70 50 61 72 73 65 2c 20 70 50 61 72  And(pParse, pPar
6820: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6850: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
6860: 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20   pExpr, 0));.   
6870: 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43   }.    if( termC
6880: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
6890: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
68a0: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
68b0: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
68c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
68d0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
68e0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
68f0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
6900: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
6910: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6920: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
6930: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
6940: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
6950: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
6960: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
6970: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6980: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
6990: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
69a0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
69b0: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
69c0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
69d0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
69e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
69f0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
6a00: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
6a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
6a20: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
6a30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6a40: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
6a50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
6a60: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
6a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
6a80: 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
6a90: 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20  create;.        
6aa0: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  }.        pLoop-
6ab0: 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b  >aLTerm[nKeyCol+
6ac0: 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
6ad0: 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
6ae0: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
6af0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6b00: 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20  ( nKeyCol>0 );. 
6b10: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
6b20: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  nEq = pLoop->nLT
6b30: 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20  erm = nKeyCol;. 
6b40: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
6b50: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
6b60: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
6b70: 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
6b80: 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
6b90: 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f          | WHERE_
6ba0: 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f  AUTO_INDEX;..  /
6bb0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6bc0: 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
6bd0: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
6be0: 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
6bf0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
6c00: 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
6c10: 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
6c20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
6c30: 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
6c40: 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
6c50: 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
6c60: 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
6c70: 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
6c80: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
6c90: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
6ca0: 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
6cb0: 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
6cc0: 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
6cd0: 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
6ce0: 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
6cf0: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
6d00: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
6d10: 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
6d20: 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
6d30: 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
6d40: 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
6d50: 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
6d60: 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
6d70: 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
6d80: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6d90: 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b  (~idxCols | MASK
6da0: 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d  BIT(BMS-1));.  m
6db0: 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d  xBitCol = MIN(BM
6dc0: 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  S-1,pTable->nCol
6dd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
6de0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
6df0: 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
6e00: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
6e10: 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
6e20: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6e30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6e40: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6e50: 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b  T(i) ) nKeyCol++
6e60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
6e70: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
6e80: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
6e90: 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61    nKeyCol += pTa
6ea0: 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
6eb0: 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  + 1;.  }..  /* C
6ec0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
6ed0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
6ee0: 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
6ef0: 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
6f00: 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
6f10: 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e  xObject(pParse->
6f20: 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30  db, nKeyCol+1, 0
6f30: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
6f40: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f  if( pIdx==0 ) go
6f50: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6f60: 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f  x_create;.  pLoo
6f70: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
6f80: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
6f90: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
6fa0: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
6fb0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
6fc0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
6fd0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
6fe0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
6ff0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
7000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
7010: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
7020: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
7030: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
7040: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
7050: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
7060: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
7070: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
7080: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
7090: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
70a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
70b0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
70c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
70d0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
70e0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
70f0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
7100: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
7110: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
7120: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
7130: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
7140: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
7150: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
7160: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
7170: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
7180: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
7190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
71a0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
71b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
71c0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
71d0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
71e0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
71f0: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
7200: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
7210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7220: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
7230: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
7240: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
7250: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
7260: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
7270: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
7280: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
7290: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
72a0: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
72b0: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
72c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
72d0: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
72e0: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
72f0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
7300: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
7310: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
7320: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
7330: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
7340: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
7350: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
7360: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
7370: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
7380: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
7390: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
73a0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
73b0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
73c0: 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [n] = sqlite3Str
73d0: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b  BINARY;.      n+
73e0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
73f0: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
7400: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
7410: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f  olumn[n] = XN_RO
7420: 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  WID;.  pIdx->azC
7430: 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33  oll[n] = sqlite3
7440: 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a  StrBINARY;..  /*
7450: 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
7460: 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
7470: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
7480: 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
7490: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
74a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
74b0: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
74c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
74d0: 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
74e0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65  el->iIdxCur, nKe
74f0: 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  yCol+1);.  sqlit
7500: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
7510: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
7520: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
7530: 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
7540: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
7550: 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
7560: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
7570: 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
7580: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d  pTabItem = &pWC-
7590: 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
75a0: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
75b0: 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49  om];.  if( pTabI
75c0: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
75d0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
75e0: 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
75f0: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
7600: 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20      addrCounter 
7610: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
7620: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7630: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
7640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7650: 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
7660: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30  ine, regYield, 0
7670: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72  , pTabItem->addr
7680: 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64  FillSub);.    ad
7690: 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33  drTop =  sqlite3
76a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
76b0: 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
76c0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
76d0: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
76e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
76f0: 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70 54  t row of %s", pT
7700: 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
7710: 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
7720: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
7730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7740: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
7750: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20  evel->iTabCur); 
7760: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7770: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74  .  }.  if( pPart
7780: 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74  ial ){.    iCont
7790: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
77a0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
77b0: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
77c0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
77d0: 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43  se, pPartial, iC
77e0: 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f  ontinue, SQLITE_
77f0: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
7800: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
7810: 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c  |= WHERE_PARTIAL
7820: 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65  IDX;.  }.  regRe
7830: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
7840: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7850: 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71  ;.  regBase = sq
7860: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
7870: 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61  exKey(.      pPa
7880: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
7890: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
78a0: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
78b0: 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  0.  );.  sqlite3
78c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
78d0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
78e0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
78f0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
7900: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7910: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
7920: 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
7930: 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
7940: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
7950: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
7960: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
7970: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
7980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
7990: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
79a0: 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42  ddrCounter, regB
79b0: 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73 74  ase+n);.    test
79c0: 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62  case( pParse->db
79d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
79e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
79f0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 30 20  evel->iIdxCur>0 
7a00: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7a10: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7a20: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7a30: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
7a60: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 70 4c  m->regResult, pL
7a70: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
7a80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
7a90: 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
7aa0: 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66  .    pTabItem->f
7ab0: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
7ac0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
7ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7ae0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
7af0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
7b00: 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65  addrTop+1); Vdbe
7b10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
7b20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
7b30: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
7b40: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
7b50: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
7b60: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
7b70: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
7b80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7b90: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
7ba0: 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
7bb0: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7bc0: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7bd0: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7be0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7bf0: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7c00: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7c10: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7c20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7c30: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7c40: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
7c50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7c60: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
7c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7c90: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
7ca0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7cb0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7cc0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7cd0: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7ce0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7cf0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7d00: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7d10: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7d20: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7d30: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7d40: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
7d50: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
7d60: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
7d70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7d80: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
7d90: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
7da0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
7db0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
7dc0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7dd0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7de0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
7df0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
7e00: 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 6e 61  clause being ana
7e10: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
7e20: 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20  sk mUnusable,   
7e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
7e40: 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20  nore terms with 
7e50: 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f  these prereqs */
7e60: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7e70: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
7e80: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
7e90: 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
7ea0: 69 73 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20  is the vtab */. 
7eb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7ec0: 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  rBy,            
7ed0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
7ee0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
7ef0: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20   *pmNoOmit      
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f10: 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f  Mask of terms no
7f20: 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a  t to omit */.){.
7f30: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
7f40: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
7f50: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7f60: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
7f70: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
7f80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7f90: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
7fa0: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
7fb0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7fc0: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
7fd0: 67 65 3b 0a 20 20 73 74 72 75 63 74 20 48 69 64  ge;.  struct Hid
7fe0: 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48  denIndexInfo *pH
7ff0: 69 64 64 65 6e 3b 0a 20 20 57 68 65 72 65 54 65  idden;.  WhereTe
8000: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
8010: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
8020: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8030: 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36  *pIdxInfo;.  u16
8040: 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20   mNoOmit = 0;.. 
8050: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
8060: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
8070: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
8080: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
8090: 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
80a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
80b0: 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
80c0: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
80d0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
80e0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
80f0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
8100: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
8110: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
8120: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
8130: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
8140: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
8150: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
8160: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
8170: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8180: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
8190: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
81a0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
81b0: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
81c0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
81d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
81e0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
81f0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
8200: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
8210: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8220: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
8230: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
8240: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
8250: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
8260: 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e  EQUIV))==0 ) con
8270: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
8280: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8290: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
82a0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
82b0: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
82c0: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
82d0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
82e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
82f0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
8300: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
8310: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
8320: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
8330: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
8340: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
8350: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
8360: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
8370: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8380: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
8390: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
83a0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
83b0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
83c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
83d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
83e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
83f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
8400: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
8410: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8420: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
8430: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
8440: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
8450: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
8460: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
8470: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
8480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8490: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
84a0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
84b0: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
84c0: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
84d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
84e0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
84f0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
8520: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
8530: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
8540: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
8570: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
8580: 72 42 79 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48  rBy + sizeof(*pH
8590: 69 64 64 65 6e 29 20 29 3b 0a 20 20 69 66 28 20  idden) );.  if( 
85a0: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
85b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
85c0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
85d0: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
85e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
85f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
8600: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
8610: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
8620: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
8630: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
8640: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
8650: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
8660: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
8670: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
8680: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
8690: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
86a0: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
86b0: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
86c0: 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
86d0: 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
86e0: 20 20 2a 2f 0a 20 20 70 48 69 64 64 65 6e 20 3d    */.  pHidden =
86f0: 20 28 73 74 72 75 63 74 20 48 69 64 64 65 6e 49   (struct HiddenI
8700: 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78 49  ndexInfo*)&pIdxI
8710: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 43 6f  nfo[1];.  pIdxCo
8720: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
8730: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8740: 72 61 69 6e 74 2a 29 26 70 48 69 64 64 65 6e 5b  raint*)&pHidden[
8750: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
8760: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
8770: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
8780: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
8790: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
87a0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
87b0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
87c0: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
87d0: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
87e0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
87f0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
8800: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
8810: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
8820: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
8830: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
8840: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8850: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
8860: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
8870: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
8880: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8890: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
88a0: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
88b0: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
88c0: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
88d0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
88e0: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
88f0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
8900: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
8950: 73 61 67 65 3b 0a 0a 20 20 70 48 69 64 64 65 6e  sage;..  pHidden
8960: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
8970: 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65 20 3d  Hidden->pParse =
8980: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
8990: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
89a0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
89b0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
89c0: 0a 20 20 20 20 75 31 36 20 6f 70 3b 0a 20 20 20  .    u16 op;.   
89d0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
89e0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
89f0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
8a00: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
8a10: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
8a20: 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e   mUnusable ) con
8a30: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
8a40: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
8a50: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8a60: 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
8a70: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8a80: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a90: 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
8aa0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8ab0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
8ac0: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
8ad0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8ae0: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
8af0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8b00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8b10: 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20  r & WO_ALL );.  
8b20: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
8b30: 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45  perator & ~(WO_E
8b40: 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74  QUIV))==0 ) cont
8b50: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8b60: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8b70: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
8b80: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
8b90: 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
8ba0: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
8bb0: 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
8bc0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
8bd0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
8be0: 6e 29 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  n).     && (pTer
8bf0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
8c00: 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_IS|WO_ISNULL)
8c10: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
8c20: 2a 20 41 6e 20 22 49 53 22 20 74 65 72 6d 20 69  * An "IS" term i
8c30: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
8c40: 73 65 20 77 68 65 72 65 20 74 68 65 20 76 69 72  se where the vir
8c50: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  tual table is th
8c60: 65 20 72 68 73 0a 20 20 20 20 20 20 2a 2a 20 6f  e rhs.      ** o
8c70: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 44  f a LEFT JOIN. D
8c80: 6f 20 6e 6f 74 20 70 61 73 73 20 74 68 69 73 20  o not pass this 
8c90: 74 65 72 6d 20 74 6f 20 74 68 65 20 76 69 72 74  term to the virt
8ca0: 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
8cb0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
8cc0: 6e 2c 20 61 73 20 74 68 69 73 20 63 61 6e 20 6c  n, as this can l
8cd0: 65 61 64 20 74 6f 20 69 6e 63 6f 72 72 65 63 74  ead to incorrect
8ce0: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 53 51   results from SQ
8cf0: 4c 20 73 75 63 68 0a 20 20 20 20 20 20 2a 2a 20  L such.      ** 
8d00: 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
8d10: 20 20 20 2a 2a 20 20 20 22 4c 45 46 54 20 4a 4f     **   "LEFT JO
8d20: 49 4e 20 76 74 61 62 20 57 48 45 52 45 20 76 74  IN vtab WHERE vt
8d30: 61 62 2e 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20  ab.col IS NULL" 
8d40: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
8d50: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
8d60: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
8d70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8d80: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
8d90: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
8da0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8db0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
8dc0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
8dd0: 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20  olumn>=(-1) );. 
8de0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
8df0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
8e00: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8e10: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
8e20: 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
8e30: 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65     op = pTerm->e
8e40: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
8e50: 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
8e60: 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
8e70: 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  Q;.    if( op==W
8e80: 4f 5f 41 55 58 20 29 7b 0a 20 20 20 20 20 20 70  O_AUX ){.      p
8e90: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8ea0: 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b  pTerm->eMatchOp;
8eb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
8ec0: 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
8ed0: 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
8ee0: 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  f( op==WO_ISNULL
8ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
8f00: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c  Cons[j].op = SQL
8f10: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8f20: 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20  AINT_ISNULL;.   
8f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f40: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
8f50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   = SQLITE_INDEX_
8f60: 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b 0a 20  CONSTRAINT_IS;. 
8f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8f80: 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  {.      pIdxCons
8f90: 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f 70 3b  [j].op = (u8)op;
8fa0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69  .      /* The di
8fb0: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8fc0: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8fd0: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
8fe0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
8ff0: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
9000: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
9010: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
9020: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
9030: 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66    The.      ** f
9040: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
9050: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
9060: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  t. */.      asse
9070: 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
9080: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9090: 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61  NT_EQ );.      a
90a0: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
90b0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
90c0: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
90d0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
90e0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
90f0: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
9100: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
9110: 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
9120: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
9130: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9140: 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
9150: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
9160: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
9170: 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
9180: 74 6f 72 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  tor&(WO_IN|WO_EQ
9190: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
91a0: 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 41 55 58 29  GT|WO_GE|WO_AUX)
91b0: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f   );..      if( o
91c0: 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  p & (WO_LT|WO_LE
91d0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20  |WO_GT|WO_GE).  
91e0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
91f0: 78 70 72 49 73 56 65 63 74 6f 72 28 70 54 65 72  xprIsVector(pTer
9200: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9210: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
9220: 20 20 20 20 69 66 28 20 69 3c 31 36 20 29 20 6d      if( i<16 ) m
9230: 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20  NoOmit |= (1 << 
9240: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
9250: 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78  op==WO_LT ) pIdx
9260: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f  Cons[j].op = WO_
9270: 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  LE;.        if( 
9280: 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49 64 78  op==WO_GT ) pIdx
9290: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f  Cons[j].op = WO_
92a0: 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  GE;.      }.    
92b0: 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  }..    j++;.  }.
92c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
92d0: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
92e0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
92f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9300: 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
9310: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
9320: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
9330: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
9340: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
9350: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
9360: 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d  rder;.  }..  *pm
9370: 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74  NoOmit = mNoOmit
9380: 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ;.  return pIdxI
9390: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
93a0: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
93b0: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
93c0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
93d0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
93e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
93f0: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
9400: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
9410: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
9420: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
9430: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
9440: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
9450: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
9460: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
9470: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
9480: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
9490: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
94a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
94b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
94c0: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
94d0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
94e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
94f0: 6e 64 20 61 6e 0a 2a 2a 20 61 70 70 72 6f 70 72  nd an.** appropr
9500: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
9510: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
9520: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
9530: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 72 6f 6d  _CONSTRAINT from
9540: 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 69  .** xBestIndex i
9550: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
9560: 20 61 6e 20 65 72 72 6f 72 2e 20 20 53 51 4c 49   an error.  SQLI
9570: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 69 6e  TE_CONSTRAINT in
9580: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
9590: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
95a0: 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 22 75 6e  iguration of "un
95b0: 75 73 61 62 6c 65 22 20 66 6c 61 67 73 20 69 6e  usable" flags in
95c0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
95d0: 6e 66 6f 20 63 61 6e 0a 2a 2a 20 6e 6f 74 20 72  nfo can.** not r
95e0: 65 73 75 6c 74 20 69 6e 20 61 20 76 61 6c 69 64  esult in a valid
95f0: 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   plan..**.** Whe
9600: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
9610: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
9620: 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
9630: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
9640: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
9650: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70  ventually free p
9660: 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e  ->idxStr if p->n
9670: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
9680: 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61  indicates.** tha
9690: 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72  t this is requir
96a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
96b0: 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  t vtabBestIndex(
96c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
96d0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69  able *pTab, sqli
96e0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
96f0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  p){.  sqlite3_vt
9700: 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69  ab *pVtab = sqli
9710: 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
9720: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e  rse->db, pTab)->
9730: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pVtab;.  int rc;
9740: 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
9750: 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
9760: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
9770: 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
9780: 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
9790: 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
97a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
97b0: 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
97c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
97d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
97e0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
97f0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
9800: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
9810: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
9820: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
9830: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9840: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
9850: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
9860: 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
9870: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9890: 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
98a0: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
98b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
98c0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
98d0: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
98e0: 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  g = 0;.  return 
98f0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
9900: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9910: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9920: 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  E) */..#ifdef SQ
9930: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
9940: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
9950: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
9960: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
9970: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
9980: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
9990: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
99a0: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
99b0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
99c0: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
99d0: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
99e0: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
99f0: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
9a00: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
9a10: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
9a20: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
9a30: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
9a40: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
9a50: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
9a60: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
9a70: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
9a80: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
9a90: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
9aa0: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
9ab0: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
9ac0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9ad0: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
9ae0: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
9af0: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
9b00: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
9b10: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
9b20: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
9b30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
9b40: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
9b50: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
9b60: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
9b70: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
9b80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
9b90: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9ba0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
9bb0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
9bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9bd0: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
9be0: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
9bf0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
9c00: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
9c10: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
9c20: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
9c30: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9c50: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
9c60: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
9c70: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
9c80: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
9c90: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
9ca0: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
9cb0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
9cc0: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
9cd0: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
9ce0: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d00: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
9d10: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
9d20: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
9d30: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9d50: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
9d60: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
9d70: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
9d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
9d90: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
9da0: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
9db0: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
9dc0: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9de0: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
9df0: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
9e00: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e20: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
9e30: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
9e40: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
9e50: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
9e60: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
9e70: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
9e80: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
9e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9ea0: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9eb0: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
9ec0: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
9ed0: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
9ee0: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
9ef0: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
9f00: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
9f10: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9f20: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9f30: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
9f40: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
9f50: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
9f60: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
9f70: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
9f80: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
9f90: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
9fa0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
9fb0: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
9fc0: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
9fd0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
9fe0: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
9ff0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
a000: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
a010: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
a020: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
a030: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
a040: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
a050: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
a060: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
a070: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
a080: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
a090: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
a0a0: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
a0b0: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
a0c0: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
a0d0: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
a0e0: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
a0f0: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
a100: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
a110: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
a120: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
a130: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
a140: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
a150: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
a160: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
a170: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
a180: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
a190: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
a1a0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
a1b0: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
a1c0: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
a1d0: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
a1e0: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
a1f0: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
a200: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
a210: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
a220: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
a230: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
a240: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
a250: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
a260: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
a270: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
a280: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
a290: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
a2a0: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
a2b0: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
a2c0: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
a2d0: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
a2e0: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
a2f0: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
a300: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
a310: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
a320: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
a330: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
a340: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
a350: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
a360: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
a370: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
a380: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
a390: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
a3a0: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
a3b0: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
a3c0: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
a3d0: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
a3e0: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
a3f0: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
a400: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
a410: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
a420: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a430: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
a440: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
a450: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
a460: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
a470: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
a480: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
a490: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
a4a0: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
a4b0: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
a4c0: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
a4d0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
a4e0: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
a4f0: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
a500: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
a510: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
a520: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
a530: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
a540: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
a550: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
a560: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
a570: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
a580: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
a590: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
a5a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
a5b0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
a5c0: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
a5d0: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
a5e0: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
a5f0: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
a600: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
a610: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
a620: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
a630: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
a640: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
a650: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
a660: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
a670: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
a680: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
a690: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
a6a0: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
a6b0: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
a6c0: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
a6d0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
a6e0: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
a6f0: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
a700: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
a710: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
a720: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
a730: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
a740: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
a750: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
a760: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
a790: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
a7a0: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
a7b0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
a7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a7d0: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
a7e0: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
a7f0: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
a800: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
a810: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
a820: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
a830: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
a840: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
a850: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
a860: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
a870: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
a880: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
a890: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
a8a0: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
a8b0: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
a8c0: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
a8d0: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
a8e0: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
a8f0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
a900: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
a910: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
a920: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
a930: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
a940: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
a950: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
a960: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
a970: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
a980: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a990: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a9a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a9b0: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
a9c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
a9d0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
a9e0: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
a9f0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
aa00: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
aa10: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
aa20: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
aa30: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
aa40: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
aa50: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
aa60: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
aa70: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
aa80: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
aa90: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
aaa0: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
aab0: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
aac0: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
aad0: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
aae0: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
aaf0: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
ab00: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
ab10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
ab20: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
ab30: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
ab40: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
ab50: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
ab60: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
ab70: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
ab80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
ab90: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
aba0: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
abb0: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
abc0: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
abd0: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
abe0: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
abf0: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
ac00: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
ac10: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
ac20: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
ac30: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
ac40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
ac50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
ac60: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
ac70: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
ac80: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
ac90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
aca0: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
acb0: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
acc0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
acd0: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
ace0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
acf0: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
ad00: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
ad10: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
ad20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
ad30: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
ad40: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
ad50: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
ad60: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
ad70: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
ad80: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
ad90: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
ada0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
adb0: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
adc0: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
add0: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
ade0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
adf0: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
ae00: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
ae10: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
ae20: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
ae30: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
ae40: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
ae50: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
ae60: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
ae70: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
ae80: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
ae90: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
aea0: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
aeb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
aec0: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
aed0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
aee0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
aef0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
af00: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
af10: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
af20: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
af30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
af40: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
af50: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
af60: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
af70: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
af80: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
af90: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
afa0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
afb0: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
afc0: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
afd0: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
afe0: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
aff0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
b000: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
b010: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
b020: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
b030: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
b040: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
b050: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
b060: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
b070: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
b080: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
b090: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
b0a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
b0b0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
b0c0: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
b0d0: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
b0e0: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
b0f0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
b100: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
b110: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
b120: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
b130: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
b140: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
b150: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
b160: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
b170: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
b180: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
b190: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
b1b0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
b1c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
b1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
b1e0: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
b1f0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
b200: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
b210: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
b220: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
b230: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
b240: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
b250: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
b260: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
b270: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
b280: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
b290: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
b2a0: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
b2b0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
b2c0: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
b2d0: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
b2e0: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
b2f0: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
b300: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
b310: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
b320: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
b330: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
b340: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
b350: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
b360: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
b370: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
b380: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
b390: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
b3a0: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
b3b0: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
b3c0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
b3d0: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
b3e0: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
b3f0: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
b400: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
b410: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
b420: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
b430: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
b440: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
b450: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
b460: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
b470: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
b480: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
b490: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
b4a0: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
b4b0: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
b4c0: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
b4d0: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
b4e0: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
b4f0: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
b500: 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20  Eq[nField-1];.  
b510: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
b520: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
b530: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
b540: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
b550: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
b560: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
b570: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b580: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
b590: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
b5a0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
b5b0: 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
b5c0: 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
b5d0: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
b5e0: 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
b5f0: 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
b600: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
b610: 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
b620: 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
b630: 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
b640: 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
b650: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
b660: 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
b670: 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
b680: 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
b690: 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
b6a0: 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
b6b0: 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
b6c0: 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
b6d0: 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
b6e0: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
b6f0: 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
b700: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
b710: 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
b720: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
b730: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
b740: 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
b750: 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
b760: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
b770: 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
b780: 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
b790: 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
b7a0: 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
b7b0: 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
b7c0: 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
b7d0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
b7e0: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
b7f0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
b800: 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
b810: 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
b820: 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
b830: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
b840: 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
b850: 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
b860: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
b870: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
b880: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
b890: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
b8a0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
b8b0: 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
b8c0: 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
b8d0: 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
b8e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b8f0: 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  nRet;.}...#ifdef
b900: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b910: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TAT4./*.** Retur
b920: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66  n the affinity f
b930: 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  or a single colu
b940: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a  mn of an index..
b950: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 49  */.char sqlite3I
b960: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
b970: 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ty(sqlite3 *db, 
b980: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
b990: 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74   iCol){.  assert
b9a0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
b9b0: 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  l<pIdx->nColumn 
b9c0: 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e  );.  if( !pIdx->
b9d0: 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69  zColAff ){.    i
b9e0: 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  f( sqlite3IndexA
b9f0: 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70  ffinityStr(db, p
ba00: 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Idx)==0 ) return
ba10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
ba20: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ba30: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43  pIdx->zColAff[iC
ba40: 6f 6c 5d 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ol]!=0 );.  retu
ba50: 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  rn pIdx->zColAff
ba60: 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66  [iCol];.}.#endif
ba70: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
ba80: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a  _ENABLE_STAT4./*
ba90: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
baa0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
bab0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
bac0: 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
bad0: 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67  ted by a.** rang
bae0: 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70  e-scan on a skip
baf0: 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72  -scan index. For
bb00: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
bb10: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
bb20: 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29  1 ON t1(a, b, c)
bb30: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  ;.**   SELECT * 
bb40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
bb50: 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20  ? AND c BETWEEN 
bb60: 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56  ? AND ?;.**.** V
bb70: 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  alue pLoop->nOut
bb80: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
bb90: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
bba0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
bbb0: 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f  s .** visited fo
bbc0: 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20  r scanning (a=? 
bbd0: 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66  AND b=?). This f
bbe0: 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20  unction reduces 
bbf0: 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a  that estimate .*
bc00: 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72  * by some factor
bc10: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
bc20: 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f  the (c BETWEEN ?
bc30: 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69   AND ?) expressi
bc40: 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74  on based.** on t
bc50: 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f  he stat4 data fo
bc60: 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69  r the index. thi
bc70: 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70  s scan will be p
bc80: 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65  eformed multiple
bc90: 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65   .** times (once
bca0: 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20   for each (a,b) 
bcb0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74  combination that
bcc0: 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73   matches a=?) is
bcd0: 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20   dealt with .** 
bce0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
bcf0: 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69  *.** It does thi
bd00: 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  s by scanning th
bd10: 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20  rough all stat4 
bd20: 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69  samples, compari
bd30: 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74  ng values.** ext
bd40: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
bd50: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69  er and pUpper wi
bd60: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
bd70: 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  ding column in e
bd80: 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49  ach.** sample. I
bd90: 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68  f L and U are th
bda0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  e number of samp
bdb0: 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  les found to be 
bdc0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20  less than or.** 
bdd0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c  equal to the val
bde0: 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ues extracted fr
bdf0: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
be00: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
be10: 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74  y, and.** N is t
be20: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
be30: 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20  of samples, the 
be40: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75  pLoop->nOut valu
be50: 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  e is adjusted.**
be60: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
be70: 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74  **   nOut = nOut
be80: 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20   * ( min(U - L, 
be90: 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49  1) / N ).**.** I
bea0: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
beb0: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
bec0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
bed0: 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20   from the term, 
bee0: 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a  L is.** set to z
bef0: 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69  ero. If pUpper i
bf00: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
bf10: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
bf20: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a  racted from it,.
bf30: 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e  ** U is set to N
bf40: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
bf50: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
bf60: 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20  sets *pbDone to 
bf70: 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  1 before returni
bf80: 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
bf90: 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20  if no value can 
bfa0: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
bfb0: 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20  m either pLower 
bfc0: 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73  or pUpper (and s
bfd0: 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74  o the.** estimat
bfe0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
bff0: 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65  of rows delivere
c000: 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  d remains unchan
c010: 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a  ged), *pbDone.**
c020: 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a   is left as is..
c030: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c040: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
c050: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
c060: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
c070: 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54  rwise, .** SQLIT
c080: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
c090: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b  int whereRangeSk
c0a0: 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  ipScanEst(.  Par
c0b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c0c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
c0d0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
c0e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
c0f0: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
c100: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
c110: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
c120: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
c130: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
c140: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
c150: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
c160: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
c170: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
c180: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
c190: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
c1a0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
c1b0: 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20   .nOut value of 
c1c0: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
c1d0: 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20  nt *pbDone      
c1e0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
c1f0: 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f  ue if at least o
c200: 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65  ne expr. value e
c210: 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20  xtracted */.){. 
c220: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
c230: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
c240: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
c250: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
c260: 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q;.  sqlite3 *db
c270: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c280: 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31   int nLower = -1
c290: 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d  ;.  int nUpper =
c2a0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20   p->nSample+1;. 
c2b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c2c0: 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20  _OK;.  u8 aff = 
c2d0: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
c2e0: 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70  mnAffinity(db, p
c2f0: 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65  , nEq);.  CollSe
c300: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
c310: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
c320: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
c330: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
c340: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
c350: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c360: 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
c370: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
c380: 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
c390: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
c3a0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
c3b0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c3c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
c3d0: 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
c3e0: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
c3f0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
c400: 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
c410: 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
c420: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c430: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
c440: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
c450: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
c460: 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
c470: 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
c480: 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
c490: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c4a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c4b0: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
c4c0: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
c4d0: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
c4e0: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
c4f0: 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
c500: 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
c510: 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
c520: 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
c530: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
c540: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
c550: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c560: 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
c570: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c580: 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
c590: 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
c5a0: 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
c5b0: 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
c5c0: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
c5d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c5e0: 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
c5f0: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
c600: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
c610: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
c620: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
c630: 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
c640: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
c650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c660: 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
c670: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
c680: 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
c690: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
c6a0: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
c6b0: 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
c6c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
c6d0: 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
c6e0: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
c6f0: 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
c700: 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
c710: 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
c720: 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
c730: 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
c740: 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
c750: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
c760: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
c770: 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
c780: 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
c790: 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
c7a0: 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
c7b0: 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
c7c0: 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
c7d0: 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
c7e0: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
c7f0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
c800: 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
c810: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
c820: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
c830: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
c840: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
c850: 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
c860: 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
c870: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
c880: 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
c890: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
c8a0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
c8b0: 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
c8c0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
c8d0: 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
c8e0: 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
c8f0: 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
c900: 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
c910: 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
c920: 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
c930: 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
c940: 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
c950: 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
c960: 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
c970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c980: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
c990: 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
c9a0: 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
c9b0: 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
c9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c9d0: 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
c9e0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
c9f0: 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
ca00: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
ca10: 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
ca20: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
ca30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ca40: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ca50: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f  _ENABLE_STAT4 */
ca60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ca70: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
ca80: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
ca90: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
caa0: 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
cab0: 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
cac0: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
cad0: 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
cae0: 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
caf0: 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
cb00: 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
cb10: 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
cb20: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
cb30: 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
cb40: 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
cb50: 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
cb60: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
cb70: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
cb80: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
cb90: 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
cba0: 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
cbb0: 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
cbc0: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
cbd0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
cbe0: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
cbf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
cc00: 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
cc10: 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
cc60: 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
cc70: 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
cc80: 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
cc90: 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
cca0: 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
ccb0: 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
ccc0: 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
ccd0: 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
cce0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
ccf0: 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
cd00: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
cd10: 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  q) is the number
cd20: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   of the index.**
cd30: 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
cd40: 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  to the range con
cd50: 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
cd60: 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
cd70: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61  umber of.** equa
cd80: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
cd90: 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
cda0: 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
cdb0: 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
cdc0: 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20  le,.** assuming 
cdd0: 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
cde0: 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
cdf0: 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
ce00: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
ce10: 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
ce20: 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
ce30: 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
ce40: 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31   nEq is set to 1
ce50: 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
ce60: 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
ce70: 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  , b, is the seco
ce80: 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  nd .** left-most
ce90: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
cea0: 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
ceb0: 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
cec0: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
ced0: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
cee0: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
cef0: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
cf00: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  to 0..**.** When
cf10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
cf20: 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74  s called, *pnOut
cf30: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
cf40: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f  qlite3LogEst() o
cf50: 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
cf60: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65  of rows that the
cf70: 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65   index scan is e
cf80: 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74  xpected to visit
cf90: 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e   without .** con
cfa0: 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e  sidering the ran
cfb0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ge constraints. 
cfc0: 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65  If nEq is 0, the
cfd0: 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20  n *pnOut is the 
cfe0: 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f  number of .** ro
cff0: 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ws in the index.
d000: 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
d010: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75  or occurs, *pnOu
d020: 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72  t is adjusted (r
d030: 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63  educed).** to ac
d040: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61  count for the ra
d050: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
d060: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
d070: 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
d080: 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
d090: 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
d0a0: 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
d0b0: 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
d0c0: 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67  .** used, a sing
d0d0: 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  le range inequal
d0e0: 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20  ity reduces the 
d0f0: 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
d100: 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a  a factor of 4. .
d110: 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66  ** and a pair of
d120: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
d130: 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
d140: 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
d150: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
d160: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
d170: 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a  actor of 64..*/.
d180: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
d190: 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
d1a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d1b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d1c0: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
d1d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
d1e0: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
d1f0: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
d200: 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
d210: 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
d220: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
d230: 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
d240: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
d250: 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
d260: 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
d270: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
d280: 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
d290: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
d2a0: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
d2b0: 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
d2c0: 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
d2d0: 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
d2e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d2f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
d300: 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
d310: 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
d320: 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
d330: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
d340: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
d350: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
d360: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
d370: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
d380: 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  Eq;..  if( p->nS
d390: 61 6d 70 6c 65 3e 30 20 26 26 20 41 4c 57 41 59  ample>0 && ALWAY
d3a0: 53 28 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  S(nEq<p->nSample
d3b0: 43 6f 6c 29 0a 20 20 20 26 26 20 4f 70 74 69 6d  Col).   && Optim
d3c0: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
d3d0: 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
d3e0: 45 5f 53 74 61 74 34 29 0a 20 20 29 7b 0a 20 20  E_Stat4).  ){.  
d3f0: 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
d400: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
d410: 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
d420: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
d430: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
d440: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
d450: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74  ];.      int nBt
d460: 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  m = pLoop->u.btr
d470: 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69  ee.nBtm;.      i
d480: 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d  nt nTop = pLoop-
d490: 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a  >u.btree.nTop;..
d4a0: 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c        /* Variabl
d4b0: 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65  e iLower will be
d4c0: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
d4d0: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
d4e0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20  er of rows in . 
d4f0: 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65       ** the inde
d500: 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20  x that are less 
d510: 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62  than the lower b
d520: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
d530: 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20  e query. The.   
d540: 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e     ** lower boun
d550: 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63  d being the conc
d560: 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20  atenation of $P 
d570: 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50  and $L, where $P
d580: 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
d590: 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
d5a0: 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
d5b0: 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
d5c0: 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
d5d0: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
d5e0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
d5f0: 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
d600: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
d610: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  wer..      **.  
d620: 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c      ** Or, if pL
d630: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ower is NULL or 
d640: 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  $L cannot be ext
d650: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28  racted from it (
d660: 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
d670: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   ** is not a sim
d680: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20  ple variable or 
d690: 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20  literal value), 
d6a0: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
d6b0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
d6c0: 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65  range is $P. Due
d6d0: 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74   to a quirk in t
d6e0: 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53  he way whereKeyS
d6f0: 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76  tats() works, ev
d700: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24  en.      ** if $
d710: 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  L is available, 
d720: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
d730: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f  is called for bo
d740: 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20  th ($P) and .   
d750: 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e     ** ($P:$L) an
d760: 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  d the larger of 
d770: 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64  the two returned
d780: 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e   values is used.
d790: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
d7a0: 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55  ** Similarly, iU
d7b0: 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65  pper is to be se
d7c0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
d7d0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
d7e0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
d7f0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
d800: 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  pper bound of th
d810: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57  e range query. W
d820: 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62  here the upper b
d830: 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  ound.      ** is
d840: 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
d850: 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
d860: 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
d870: 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
d880: 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  lues.      ** of
d890: 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75   iUpper are requ
d8a0: 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65  ested of whereKe
d8b0: 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65  yStats() and the
d8c0: 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20   smaller used.. 
d8d0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
d8e0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   The number of r
d8f0: 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ows between the 
d900: 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68  two bounds is th
d910: 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69  en just iUpper-i
d920: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  Lower..      */.
d930: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c        tRowcnt iL
d940: 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  ower;     /* Row
d950: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
d960: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
d970: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70       tRowcnt iUp
d980: 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  per;     /* Rows
d990: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
d9a0: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  pper bound */.  
d9b0: 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20      int iLwrIdx 
d9c0: 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -2;   /* aSamp
d9d0: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77  le[] for the low
d9e0: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
d9f0: 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20    int iUprIdx = 
da00: 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -1;   /* aSample
da10: 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72  [] for the upper
da20: 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20   bound */..     
da30: 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20   if( pRec ){.   
da40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
da50: 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75  Rec->nField!=pBu
da60: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
da70: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63   );.        pRec
da80: 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c  ->nField = pBuil
da90: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
daa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
dab0: 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65   Determine iLowe
dac0: 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69  r and iUpper usi
dad0: 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f  ng ($P) only. */
dae0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  .      if( nEq==
daf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f  0 ){.        iLo
db00: 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
db10: 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f   iUpper = p->nRo
db20: 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c  wEst0;.      }el
db30: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
db40: 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63  ote: this call c
db50: 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65  ould be optimize
db60: 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74  d away - since t
db70: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d  he same values m
db80: 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ust .        ** 
db90: 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
dba0: 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
dbb0: 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
dbc0: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
dbd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72   */.        wher
dbe0: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
dbf0: 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
dc00: 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  ;.        iLower
dc10: 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20   = a[0];.       
dc20: 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b   iUpper = a[0] +
dc30: 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a   a[1];.      }..
dc40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
dc50: 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77  ower==0 || (pLow
dc60: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
dc70: 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
dc80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
dc90: 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  t( pUpper==0 || 
dca0: 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
dcb0: 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
dcc0: 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
dcd0: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74  assert( p->aSort
dce0: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
dcf0: 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72    if( p->aSortOr
dd00: 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20  der[nEq] ){.    
dd10: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73      /* The roles
dd20: 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   of pLower and p
dd30: 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70 65  Upper are swappe
dd40: 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64  d for a DESC ind
dd50: 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57  ex */.        SW
dd60: 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70  AP(WhereTerm*, p
dd70: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a  Lower, pUpper);.
dd80: 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74          SWAP(int
dd90: 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20  , nBtm, nTop);. 
dda0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ddb0: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
ddc0: 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f  prove on the iLo
ddd0: 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  wer estimate usi
dde0: 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20  ng ($P:$L). */. 
ddf0: 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20       if( pLower 
de00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
de10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de20: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65       /* Values e
de30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
de40: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
de50: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
de60: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
de70: 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
de80: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
de90: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
dea0: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
deb0: 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26  pr, nBtm, nEq, &
dec0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
ded0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dee0: 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   n ){.          
def0: 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
df00: 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b          u16 mask
df10: 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a   = WO_GT|WO_LE;.
df20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
df30: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
df40: 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d  ize(pExpr)>n ) m
df50: 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f  ask = (WO_LE|WO_
df60: 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  LT);.          i
df70: 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  LwrIdx = whereKe
df80: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
df90: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
dfa0: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
dfb0: 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d  a[0] + ((pLower-
dfc0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73  >eOperator & mas
dfd0: 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  k) ? a[1] : 0);.
dfe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
dff0: 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77  ew>iLower ) iLow
e000: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
e010: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
e020: 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20         pLower = 
e030: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
e040: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
e050: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
e060: 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65  ove on the iUppe
e070: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
e080: 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20   ($P:$U). */.   
e090: 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b     if( pUpper ){
e0a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  .        int n; 
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74     /* Values ext
e0d0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
e0e0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
e0f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
e100: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
e110: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
e120: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
e130: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
e140: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
e150: 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29  , nTop, nEq, &n)
e160: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e170: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
e180: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
e190: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
e1a0: 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d        u16 mask =
e1b0: 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_GT|WO_LE;.  
e1c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
e1d0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
e1e0: 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73  e(pExpr)>n ) mas
e1f0: 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54  k = (WO_LE|WO_LT
e200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70  );.          iUp
e210: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
e220: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
e230: 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
e240: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
e250: 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
e260: 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29  Operator & mask)
e270: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
e280: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
e290: 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72  <iUpper ) iUpper
e2a0: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
e2b0: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
e2c0: 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b       pUpper = 0;
e2d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e2e0: 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64   }..      pBuild
e2f0: 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
e300: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
e310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e320: 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
e330: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
e340: 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
e350: 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
e360: 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
e370: 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20      /* TUNING:  
e380: 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61  If both iUpper a
e390: 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65  nd iLower are de
e3a0: 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73  rived from the s
e3b0: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
e3c0: 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73   sample, then as
e3d0: 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78  sume they are 4x
e3e0: 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e   more selective.
e3f0: 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20    This brings.  
e400: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
e410: 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69  stimated selecti
e420: 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e  vity more in lin
e430: 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77  e with what it w
e440: 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20  ould be.        
e450: 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65    ** if estimate
e460: 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73  d without the us
e470: 65 20 6f 66 20 53 54 41 54 34 20 74 61 62 6c 65  e of STAT4 table
e480: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
e490: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
e4a0: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
e4b0: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
e4c0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
e4d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
e4e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
e4f0: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
e500: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
e510: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
e520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e530: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
e540: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
e550: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
e560: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
e570: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
e580: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
e590: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
e5a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
e5c0: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
e5d0: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
e5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e5f0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
e600: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
e610: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
e620: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
e630: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
e640: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
e650: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
e660: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e670: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
e680: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
e690: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
e6a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
e6b0: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
e6c0: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
e6d0: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
e6e0: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
e6f0: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
e700: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
e710: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
e720: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
e730: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
e740: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
e750: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
e760: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
e770: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
e780: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
e790: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
e7a0: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
e7b0: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
e7c0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
e7d0: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
e7e0: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
e7f0: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
e800: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
e810: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
e820: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
e830: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
e840: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
e850: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
e860: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
e870: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
e880: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
e890: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
e8a0: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
e8b0: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
e8c0: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
e8d0: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
e8e0: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
e8f0: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
e900: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
e910: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
e920: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
e930: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
e940: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
e950: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
e960: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
e970: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
e980: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
e990: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
e9a0: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
e9b0: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
e9c0: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
e9d0: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
e9e0: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
e9f0: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
ea00: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
ea10: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
ea20: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
ea30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ea40: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
ea50: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
ea60: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
ea70: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
ea80: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
ea90: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
eaa0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
eab0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
eac0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ead0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
eae0: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
eaf0: 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
eb00: 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
eb10: 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
eb20: 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
eb30: 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
eb40: 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
eb50: 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
eb60: 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
eb70: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
eb80: 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
eb90: 74 65 5f 73 74 61 74 34 20 68 69 73 74 6f 67 72  te_stat4 histogr
eba0: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
ebb0: 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
ebc0: 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
ebd0: 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
ebe0: 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
ebf0: 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
ec00: 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
ec10: 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
ec20: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
ec30: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
ec40: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
ec50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ec60: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
ec70: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
ec80: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
ec90: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
eca0: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
ecb0: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
ecc0: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
ecd0: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
ece0: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
ecf0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
ed00: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
ed10: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
ed20: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
ed30: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
ed40: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
ed50: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
ed60: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
ed70: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
ed80: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
ed90: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
eda0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
edb0: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
edc0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
edd0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
ede0: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
edf0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
ee00: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
ee10: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
ee20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
ee30: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
ee40: 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
ee50: 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
ee60: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
ee70: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
ee80: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ee90: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
eea0: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
eeb0: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
eec0: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
eed0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
eee0: 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
eef0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
ef00: 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
ef10: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
ef20: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
ef30: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ef40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
ef50: 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
ef60: 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
ef70: 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20  nt a[2];        
ef80: 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69       /* Statisti
ef90: 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b  cs */.  int bOk;
efa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e  ..  assert( nEq>
efb0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
efc0: 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq<=p->nColumn 
efd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
efe0: 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
eff0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
f000: 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
f010: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
f020: 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20  Valid<nEq );..  
f030: 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65  /* If values are
f040: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
f050: 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  or all fields of
f060: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68   the index to th
f070: 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
f080: 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69  his one, no esti
f090: 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65  mate can be made
f0a0: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
f0b0: 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69  NOTFOUND. */.  i
f0c0: 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  f( pBuilder->nRe
f0d0: 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29  cValid<(nEq-1) )
f0e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
f0f0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
f100: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  }..  /* This is 
f110: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
f120: 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74  only. The call t
f130: 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  o sqlite3Stat4Pr
f140: 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20  obeSetValue().  
f150: 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72  ** below would r
f160: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76  eturn the same v
f170: 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  alue.  */.  if( 
f180: 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq>=p->nColumn 
f190: 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  ){.    *pnRow = 
f1a0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
f1b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
f1c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
f1d0: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
f1e0: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
f1f0: 20 70 45 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31   pExpr, 1, nEq-1
f200: 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
f210: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
f220: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f230: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
f240: 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
f250: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f260: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
f270: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
f280: 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
f290: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
f2a0: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
f2b0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f2c0: 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
f2d0: 6e 20 72 65 67 69 6f 6e 73 20 25 73 28 25 64 29  n regions %s(%d)
f2e0: 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %d\n",.       
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
f300: 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e  Name, nEq-1, (in
f310: 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
f320: 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
f330: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
f340: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
f350: 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 23  ABLE_STAT4 */..#
f360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f370: 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  BLE_STAT4./*.** 
f380: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
f390: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
f3a0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
f3b0: 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
f3c0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
f3d0: 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
f3e0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
f3f0: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
f400: 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
f410: 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
f420: 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
f430: 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
f440: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
f450: 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
f460: 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
f470: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
f480: 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
f490: 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
f4a0: 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
f4b0: 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
f4c0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
f4d0: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
f4e0: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
f4f0: 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
f500: 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
f510: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f520: 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
f530: 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
f540: 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
f550: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
f560: 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
f570: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
f580: 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
f590: 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
f5a0: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
f5b0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
f5c0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
f5d0: 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
f5e0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
f5f0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
f600: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
f610: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
f620: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
f630: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
f640: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
f650: 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
f660: 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
f670: 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
f680: 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
f690: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
f6a0: 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
f6b0: 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
f6c0: 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
f6d0: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
f6e0: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
f6f0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f700: 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20  ;.  i64 nRow0 = 
f710: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
f720: 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  nt(p->aiRowLogEs
f730: 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65  t[0]);.  int nRe
f740: 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
f750: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
f760: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f770: 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
f780: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
f790: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
f7a0: 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
f7b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
f7c0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
f7d0: 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
f7e0: 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
f7f0: 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
f800: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
f810: 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
f820: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f830: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
f840: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
f850: 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
f860: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
f870: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f880: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
f890: 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
f8a0: 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20  nRow0;.    rc = 
f8b0: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
f8c0: 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
f8d0: 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  er, pList->a[i].
f8e0: 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
f8f0: 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
f900: 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  st;.    pBuilder
f910: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
f920: 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20  ecValid;.  }..  
f930: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f940: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
f950: 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e  wEst > nRow0 ) n
f960: 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a  RowEst = nRow0;.
f970: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
f980: 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54  wEst;.    WHERET
f990: 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72  RACE(0x10,("IN r
f9a0: 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74  ow estimate: est
f9b0: 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  =%d\n", nRowEst)
f9c0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
f9d0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
f9e0: 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20  alid==nRecValid 
f9f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
fa00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fa10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20  TE_ENABLE_STAT4 
fa20: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
fa30: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
fa40: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
fa50: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
fa60: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
fa70: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fa80: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
fa90: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
faa0: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
fab0: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
fac0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fad0: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
fae0: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
faf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
fb00: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
fb10: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
fb20: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
fb30: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
fb40: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
fb50: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
fb60: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
fb70: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
fb80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
fb90: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
fba0: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
fbb0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
fbc0: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
fbd0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
fbe0: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
fbf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
fc00: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
fc10: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
fc20: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
fc30: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
fc40: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
fc50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fc60: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
fc70: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
fc80: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
fc90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fca0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
fcb0: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
fcc0: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
fcd0: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
fce0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
fcf0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
fd00: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
fd10: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
fd30: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
fd40: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
fd50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
fd60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
fd70: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
fd80: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
fd90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
fda0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fdb0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
fdc0: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
fdd0: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
fde0: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
fdf0: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
fe00: 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d 2c  ",.       iTerm,
fe10: 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20 7a   pTerm, zType, z
fe20: 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72 75  Left, pTerm->tru
fe30: 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70  thProb,.       p
fe40: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c  Term->eOperator,
fe50: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29   pTerm->wtFlags)
fe60: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fe70: 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20  >iField ){.     
fe80: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
fe90: 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64 5c  ntf(" iField=%d\
fea0: 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c  n", pTerm->iFiel
feb0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
fec0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
fed0: 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
fee0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fef0: 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
ff00: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29  pTerm->pExpr, 0)
ff10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ff20: 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
ff30: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
ff40: 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  Show the complet
ff50: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
ff60: 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f  hereClause.*/.vo
ff70: 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  id sqlite3WhereC
ff80: 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65  lausePrint(Where
ff90: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
ffa0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ffb0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
ffc0: 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54  i++){.    whereT
ffd0: 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61  ermPrint(&pWC->a
ffe0: 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23  [i], i);.  }.}.#
fff0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48  endif..#ifdef WH
10000 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
10010 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
10020 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
10030 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
10040 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
10050 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
10060 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
10070 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  p, WhereClause *
10080 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  pWC){.  WhereInf
10090 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
100a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  >pWInfo;.  int n
100b0 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70  b = 1+(pWInfo->p
100c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29  TabList->nSrc+3)
100d0 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /4;.  struct Src
100e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
100f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
10100 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62  ist->a + p->iTab
10110 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
10120 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
10130 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20   Bitmask mAll = 
10140 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
10150 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71  nb*4)) - 1;.  sq
10160 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10170 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
10180 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
101b0 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
101c0 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d  b, p->prereq & m
101d0 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  All);.  sqlite3D
101e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
101f0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
10200 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
10210 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
10220 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
10230 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
10240 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10250 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
10260 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
10270 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
10280 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
10290 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
102a0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
102b0 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
102c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
102d0 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
102e0 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
102f0 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
10300 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
10310 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
10320 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
10330 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
10340 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
10350 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
10360 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10370 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10380 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
10390 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
103a0 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
103b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
103c0 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
103d0 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
103e0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
103f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
10400 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
10410 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
10420 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
10430 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
10440 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
10450 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
10460 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
10470 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
10480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10490 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
104a0 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
104b0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
104c0 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
104d0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
104e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
104f0 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
10500 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
10510 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69  free(z);.  }.  i
10520 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
10530 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29  WHERE_SKIPSCAN )
10540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
10550 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
10560 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46  x %d-%d", p->wsF
10570 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c  lags, p->nLTerm,
10580 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  p->nSkip);.  }el
10590 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
105a0 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
105b0 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
105c0 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
105d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
105e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
105f0 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
10600 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
10610 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
10620 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
10630 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
10640 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
10650 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
10660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
10670 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
10680 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
10690 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
106a0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
106b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
106c0 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
106d0 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
106e0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
106f0 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
10700 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
10710 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
10720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10730 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
10740 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
10750 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
10760 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
10770 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
10780 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10790 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
107a0 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
107b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
107c0 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
107d0 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
107e0 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
107f0 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
10800 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
10810 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
10820 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
10830 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
10840 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
10850 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
10860 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
10870 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
10880 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10890 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
108a0 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
108b0 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
108c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
108d0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
108e0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
108f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
10900 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
10910 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
10920 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
10930 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
10940 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
10950 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10960 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
10970 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10980 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10990 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
109a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
109b0 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  N(db, p->u.btree
109c0 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  .pIndex);.      
109d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
109e0 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
109f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
10a00 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65  cate internal me
10a10 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57  mory used by a W
10a20 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
10a30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10a40 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71  hereLoopClear(sq
10a50 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10a60 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
10a70 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
10a80 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
10a90 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
10aa0 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68  p->aLTerm);.  wh
10ab0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
10ac0 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72  n(db, p);.  wher
10ad0 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a  eLoopInit(p);.}.
10ae0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20  ./*.** Increase 
10af0 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
10b00 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d  ation for pLoop-
10b10 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20  >aLTerm[] to be 
10b20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73  at least n..*/.s
10b30 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
10b40 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
10b50 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
10b60 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57   *p, int n){.  W
10b70 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77  hereTerm **paNew
10b80 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f  ;.  if( p->nLSlo
10b90 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51  t>=n ) return SQ
10ba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28  LITE_OK;.  n = (
10bb0 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77  n+7)&~7;.  paNew
10bc0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
10bd0 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
10be0 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
10bf0 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77  *n);.  if( paNew
10c00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
10c10 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
10c20 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20    memcpy(paNew, 
10c30 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f  p->aLTerm, sizeo
10c40 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a  f(p->aLTerm[0])*
10c50 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66  p->nLSlot);.  if
10c60 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e  ( p->aLTerm!=p->
10c70 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71  aLTermSpace ) sq
10c80 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
10c90 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
10ca0 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65  p->aLTerm = paNe
10cb0 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  w;.  p->nLSlot =
10cc0 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   n;.  return SQL
10cd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10ce0 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e   Transfer conten
10cf0 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  t from the secon
10d00 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  d pLoop into the
10d10 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   first..*/.stati
10d20 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58  c int whereLoopX
10d30 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fer(sqlite3 *db,
10d40 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c   WhereLoop *pTo,
10d50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f   WhereLoop *pFro
10d60 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m){.  whereLoopC
10d70 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
10d80 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  o);.  if( whereL
10d90 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54  oopResize(db, pT
10da0 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d  o, pFrom->nLTerm
10db0 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ) ){.    memset(
10dc0 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  &pTo->u, 0, size
10dd0 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20  of(pTo->u));.   
10de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10df0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
10e00 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
10e10 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
10e20 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
10e30 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
10e40 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
10e50 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
10e60 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
10e70 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
10e80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10e90 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
10ea0 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
10eb0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
10ec0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
10ed0 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
10ee0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
10ef0 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
10f00 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
10f10 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
10f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10f30 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
10f40 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
10f50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10f60 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
10f70 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
10f80 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
10f90 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
10fa0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
10fb0 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
10fc0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
10fd0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
10fe0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
10ff0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
11000 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
11010 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
11020 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
11030 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b 0a  t( pWInfo!=0 );.
11040 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49    for(i=0; i<pWI
11050 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
11060 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
11070 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  l *pLevel = &pWI
11080 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69  nfo->a[i];.    i
11090 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
110a0 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
110b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
110c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
110d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
110e0 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
110f0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
11100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
11110 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43  ite3WhereClauseC
11120 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57  lear(&pWInfo->sW
11130 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 49  C);.  while( pWI
11140 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
11150 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20     WhereLoop *p 
11160 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  = pWInfo->pLoops
11170 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c  ;.    pWInfo->pL
11180 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  oops = p->pNextL
11190 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  oop;.    whereLo
111a0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
111b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
111c0 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e 66  FreeNN(db, pWInf
111d0 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  o);.}../*.** Ret
111e0 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20  urn TRUE if all 
111f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
11200 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
11210 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74 68     (1)  X has th
11220 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
11230 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20  cost that Y.**  
11240 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65 77   (2)  X uses few
11250 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  er WHERE clause 
11260 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a 20  terms than Y.** 
11270 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48 45    (3)  Every WHE
11280 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
11290 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f  sed by X is also
112a0 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20 20   used by Y.**   
112b0 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74 20  (4)  X skips at 
112c0 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f  least as many co
112d0 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20 20  lumns as Y.**   
112e0 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20 63  (5)  If X is a c
112f0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
11300 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a 0a  han Y is too.**.
11310 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28 32  ** Conditions (2
11320 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20 74  ) and (3) mean t
11330 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f 70  hat X is a "prop
11340 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59 2e  er subset" of Y.
11350 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
11360 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
11370 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
11380 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
11390 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
113a0 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
113b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
113c0 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
113d0 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
113e0 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
113f0 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
11400 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20  o be adjusted.  
11410 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a 2a  Constraint (4).*
11420 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61  * was added beca
11430 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b  use if X uses sk
11440 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61  ip-scan less tha
11450 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67  n Y it still mig
11460 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20  ht.** deserve a 
11470 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20  lower cost even 
11480 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65  if it is a prope
11490 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20 20  r subset of Y.  
114a0 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a 2a  Constraint (5).*
114b0 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61  * was added beca
114c0 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69  use a covering i
114d0 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64 65  ndex probably de
114e0 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20 61  serves to have a
114f0 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20 74   lower cost.** t
11500 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69  han a non-coveri
11510 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69 66  ng index even if
11520 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72 20   it is a proper 
11530 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  subset..*/.stati
11540 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
11550 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
11560 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
11570 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
11580 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
11590 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
115a0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
115b0 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
115c0 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
115d0 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
115e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
115f0 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
11600 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
11610 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
11620 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
11630 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
11640 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
11650 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
11660 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
11670 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
11680 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
11690 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
116a0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
116b0 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
116c0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
116d0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
116e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
116f0 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
11700 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
11710 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
11720 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
11730 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
11740 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
11750 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
11760 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
11770 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
11780 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
11790 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
117a0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
117b0 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
117c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
117d0 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
117e0 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
117f0 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
11800 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
11810 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
11820 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73 46  }.  if( (pX->wsF
11830 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f  lags&WHERE_IDX_O
11840 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20 28  NLY)!=0 .   && (
11850 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  pY->wsFlags&WHER
11860 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
11870 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
11880 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 28   /* Constraint (
11890 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  5) */.  }.  retu
118a0 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f  rn 1;  /* All co
118b0 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f  nditions meet */
118c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
118d0 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   adjust the cost
118e0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54   of WhereLoop pT
118f0 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20  emplate upwards 
11900 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a  or downwards so.
11910 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ** that:.**.**  
11920 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (1) pTemplate c
11930 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61  osts less than a
11940 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
11950 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70  ops that are a p
11960 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73  roper.**       s
11970 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61  ubset of pTempla
11980 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70  te.**.**   (2) p
11990 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d  Template costs m
119a0 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ore than any oth
119b0 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f  er WhereLoops fo
119c0 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74  r which pTemplat
119d0 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20  e.**       is a 
119e0 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
119f0 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65  *.** To say "Whe
11a00 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72  reLoop X is a pr
11a10 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
11a20 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75  " means that X u
11a30 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45  ses fewer.** WHE
11a40 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
11a50 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
11a60 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
11a70 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
11a80 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65  X is.** also use
11a90 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  d by Y..*/.stati
11aa0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
11ab0 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74  AdjustCost(const
11ac0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57   WhereLoop *p, W
11ad0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11ae0 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65  ate){.  if( (pTe
11af0 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
11b00 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
11b10 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11b20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  for(; p; p=p->pN
11b30 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66  extLoop){.    if
11b40 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
11b50 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e  late->iTab ) con
11b60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
11b70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11b80 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
11b90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
11ba0 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
11bb0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
11bc0 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b  p, pTemplate) ){
11bd0 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
11be0 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
11bf0 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74  downward so that
11c00 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74   it is cheaper t
11c10 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a  han its .      *
11c20 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20  * subset p. */. 
11c30 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
11c40 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
11c50 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
11c60 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
11c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11c80 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
11c90 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
11ca0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
11cb0 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a  n, p->nOut-1));.
11cc0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11cd0 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
11ce0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11cf0 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
11d00 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   - 1;.    }else 
11d10 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11d20 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11d30 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29  (pTemplate, p) )
11d40 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
11d50 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
11d60 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20   upward so that 
11d70 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74  it is costlier t
11d80 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20  han p since.    
11d90 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    ** pTemplate i
11da0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
11db0 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20  t of p */.      
11dc0 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
11dd0 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
11de0 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
11df0 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
11e20 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
11e30 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
11e40 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20  >nOut+1));.     
11e50 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
11e60 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
11e70 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
11e80 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b  t = p->nOut + 1;
11e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11ea0 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c  .** Search the l
11eb0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
11ec0 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f  s in *ppPrev loo
11ed0 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61  king for one tha
11ee0 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70 6c  t can be.** repl
11ef0 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  aced by pTemplat
11f00 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
11f10 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61 74  NULL if pTemplat
11f20 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e  e does not belon
11f30 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c 6f  g on the WhereLo
11f40 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20 6f  op list..** In o
11f50 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70 54  ther words if pT
11f60 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74 6f  emplate ought to
11f70 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
11f80 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65   further conside
11f90 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
11fa0 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f   pX is a WhereLo
11fb0 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74  op that pTemplat
11fc0 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20 74  e can replace, t
11fd0 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  hen return the.*
11fe0 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e  * link that poin
11ff0 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20  ts to pX..**.** 
12000 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  If pTemplate can
12010 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  not replace any 
12020 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74  existing element
12030 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75 74   of the list but
12040 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
12050 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
12060 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72 79  t as a new entry
12070 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
12080 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
12090 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69  * tail of the li
120a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  st..*/.static Wh
120b0 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c  ereLoop **whereL
120c0 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20  oopFindLesser(. 
120d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
120e0 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65  rev,.  const Whe
120f0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
12100 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e.){.  WhereLoop
12110 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70   *p;.  for(p=(*p
12120 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65  pPrev); p; ppPre
12130 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
12140 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
12150 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
12160 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
12170 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
12180 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
12190 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
121a0 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
121b0 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
121c0 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
121d0 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
121e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
121f0 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
12200 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
12210 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
12220 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
12230 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
12240 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
12250 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
12260 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
12270 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
12280 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
12290 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
122a0 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
122b0 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
122c0 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
122d0 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
122e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
122f0 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
12300 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
12310 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
12320 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
12330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12340 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
12350 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
12360 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
12370 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
12380 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
12390 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
123a0 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
123b0 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
123c0 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
123d0 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
123e0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
123f0 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
12400 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
12410 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
12420 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
12430 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
12440 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
12450 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
12460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12470 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
12480 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
12490 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73    /* Any loop us
124a0 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f  ing an appliatio
124b0 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20  n-defined index 
124c0 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  (or PRIMARY KEY 
124d0 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45  or.    ** UNIQUE
124e0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74   constraint) wit
124f0 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d  h one or more ==
12500 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   constraints is 
12510 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
12520 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  an an automatic 
12530 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74  index. Unless it
12540 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e   is a skip-scan.
12550 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
12560 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
12570 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
12580 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
12590 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20  e->nSkip)==0.   
125a0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
125b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
125c0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
125d0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
125e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
125f0 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20  _COLUMN_EQ)!=0. 
12600 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65      && (p->prere
12610 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
12620 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
12630 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b  e->prereq.    ){
12640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12650 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
12660 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
12670 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
12680 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
12690 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
126a0 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
126b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
126c0 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
126d0 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
126e0 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
126f0 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
12700 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
12710 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
12720 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
12730 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
12740 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
12750 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
12760 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
12770 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
12780 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
12790 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
127a0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
127d0 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
127e0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
12810 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
12820 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
12850 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
12860 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
12870 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
12880 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
12890 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
128a0 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
128b0 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
128c0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
128d0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
128e0 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
128f0 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
12900 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
12910 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
12920 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
12930 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
12940 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
12950 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
12960 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
12970 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
12980 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
12990 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
129a0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
129b0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
129c0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
129d0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
129e0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
12a10 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
12a20 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
12a30 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
12a60 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
12a70 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
12a80 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
12a90 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
12aa0 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
12ab0 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
12ac0 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
12ad0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
12ae0 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
12af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
12b00 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
12b10 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
12b20 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
12b30 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
12b40 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
12b50 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
12b60 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
12b70 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
12b80 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
12b90 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
12ba0 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
12bb0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
12bc0 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
12bd0 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
12be0 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
12bf0 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
12c00 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
12c10 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
12c20 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
12c30 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
12c40 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
12c50 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
12c60 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
12c70 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
12c80 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
12c90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
12ca0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
12cb0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
12cc0 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
12cd0 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
12ce0 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
12cf0 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
12d00 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
12d10 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
12d20 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
12d30 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
12d40 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
12d50 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
12d60 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
12d70 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
12d80 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
12d90 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
12da0 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
12db0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
12dc0 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
12dd0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
12de0 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
12df0 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
12e00 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
12e10 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
12e20 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
12e30 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
12e40 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
12e50 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
12e60 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
12e70 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
12e80 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
12e90 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
12ea0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
12eb0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
12ec0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
12ed0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
12ee0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
12ef0 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
12f00 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
12f10 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
12f20 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
12f30 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
12f40 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
12f50 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
12f60 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
12f70 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
12f80 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
12f90 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
12fa0 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
12fb0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
12fc0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
12fd0 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
12fe0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
12ff0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
13000 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13010 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
13020 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
13030 20 2f 2a 20 53 74 6f 70 20 74 68 65 20 73 65 61   /* Stop the sea
13040 72 63 68 20 6f 6e 63 65 20 77 65 20 68 69 74 20  rch once we hit 
13050 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
13060 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20 2a  r search limit *
13070 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
13080 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 3d 3d 30 20  ->iPlanLimit==0 
13090 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
130a0 45 28 30 78 66 66 66 66 66 66 66 66 2c 28 22 3d  E(0xffffffff,("=
130b0 3d 3d 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  == query planner
130c0 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20 72 65   search limit re
130d0 61 63 68 65 64 20 3d 3d 3d 5c 6e 22 29 29 3b 0a  ached ===\n"));.
130e0 20 20 20 20 69 66 28 20 70 42 75 69 6c 64 65 72      if( pBuilder
130f0 2d 3e 70 4f 72 53 65 74 20 29 20 70 42 75 69 6c  ->pOrSet ) pBuil
13100 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 20 3d  der->pOrSet->n =
13110 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
13120 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
13130 20 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61    pBuilder->iPla
13140 6e 4c 69 6d 69 74 2d 2d 3b 0a 0a 20 20 2f 2a 20  nLimit--;..  /* 
13150 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
13160 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  Set is defined, 
13170 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
13180 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74  rack of the cost
13190 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65  s.  ** and prere
131a0 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  qs..  */.  if( p
131b0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21  Builder->pOrSet!
131c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  =0 ){.    if( pT
131d0 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20  emplate->nLTerm 
131e0 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  ){.#if WHERETRAC
131f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
13200 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
13210 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
13220 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69     int x =.#endi
13230 66 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  f.      whereOrI
13240 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e  nsert(pBuilder->
13250 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74  pOrSet, pTemplat
13260 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70  e->prereq, pTemp
13270 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20  late->rRun,.    
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132a0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29  pTemplate->nOut)
132b0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
132c0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
132d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
132e0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
132f0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20   0x8 ){.        
13300 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
13310 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20  tf(x?"   or-%d: 
13320 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c   ":"   or-X:  ",
13330 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   n);.        whe
13340 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
13350 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
13360 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
13370 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ;.  }..  /* Look
133a0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
133b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65   WhereLoop to re
133c0 70 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70  place with pTemp
133d0 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72  late.  */.  wher
133e0 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
133f0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
13400 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70  pTemplate);.  pp
13410 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Prev = whereLoop
13420 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e  FindLesser(&pWIn
13430 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
13440 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  plate);..  if( p
13450 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20  pPrev==0 ){.    
13460 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79  /* There already
13470 20 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c   exists a WhereL
13480 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  oop on the list 
13490 74 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20  that is better. 
134a0 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70     ** than pTemp
134b0 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67  late, so just ig
134c0 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a  nore pTemplate *
134d0 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
134e0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
134f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13500 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
13510 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
13520 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
13530 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20     skip: ");.   
13540 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
13550 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
13560 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
13570 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
13580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
13590 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70   .  }else{.    p
135a0 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a   = *ppPrev;.  }.
135b0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
135c0 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
135d0 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
135e0 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  r p[] should be 
135f0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a  overwritten.  **
13600 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b   with pTemplate[
13610 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c  ] if p[] exists,
13620 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74   or if p==NULL t
13630 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  hen allocate a n
13640 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f  ew.  ** WhereLoo
13650 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e  p and insert it.
13660 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  .  */.#if WHERET
13670 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
13680 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  0x8 */.  if( sql
13690 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
136a0 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20   0x8 ){.    if( 
136b0 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p!=0 ){.      sq
136c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
136d0 28 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20  ("replace: ");. 
136e0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
136f0 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d  int(p, pBuilder-
13700 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  >pWC);.      sql
13710 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
13720 22 20 20 20 77 69 74 68 3a 20 22 29 3b 0a 20 20  "   with: ");.  
13730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
13740 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
13750 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
13760 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c      }.    whereL
13770 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
13780 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
13790 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  C);.  }.#endif. 
137a0 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
137b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
137c0 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ew WhereLoop to 
137d0 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  add to the end o
137e0 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  f the list */.  
137f0 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20    *ppPrev = p = 
13800 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
13810 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
13820 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20  WhereLoop));.   
13830 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
13840 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
13850 42 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c  BKPT;.    whereL
13860 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
13870 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
13880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
13890 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
138a0 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
138b0 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
138c0 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
138d0 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
138e0 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
138f0 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
13900 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
13910 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
13920 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
13930 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
13940 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
13950 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
13960 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
13970 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
13980 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
13990 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
139a0 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
139b0 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
139c0 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
139d0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
139e0 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
139f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
13a00 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
13a10 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
13a20 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
13a30 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
13a40 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
13a50 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
13a60 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
13a70 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
13a80 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
13a90 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
13aa0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
13ab0 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
13ac0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
13ad0 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
13ae0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
13af0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13b00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
13b10 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
13b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20  .    }.  }.  rc 
13b30 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28  = whereLoopXfer(
13b40 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
13b50 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
13b60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
13b70 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
13b80 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  .    Index *pInd
13b90 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ex = p->u.btree.
13ba0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
13bb0 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78  pIndex && pIndex
13bc0 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  ->idxType==SQLIT
13bd0 45 5f 49 44 58 54 59 50 45 5f 49 50 4b 20 29 7b  E_IDXTYPE_IPK ){
13be0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
13bf0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
13c00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13c10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
13c20 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f  just the WhereLo
13c30 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f  op.nOut value do
13c40 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e  wnward to accoun
13c50 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  t for terms of t
13c60 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
13c70 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  se that referenc
13c80 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77  e the loop but w
13c90 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
13ca0 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  d by an.** index
13cb0 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ..*.** For every
13cc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13cd0 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
13ce0 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
13cf0 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61  .** and which ha
13d00 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  s a truth probab
13d10 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62  ility assigned b
13d20 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b  y one of the lik
13d30 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69  elihood(),.** li
13d40 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b  kely(), or unlik
13d50 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ely() SQL functi
13d60 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20  ons, reduce the 
13d70 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
13d80 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  .** of output ro
13d90 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62  ws by the probab
13da0 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e  ility specified.
13db0 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20  .**.** TUNING:  
13dc0 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
13dd0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
13de0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
13df0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
13e00 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
13e10 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
13e20 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
13e30 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a  ty, heuristics.*
13e40 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f  * described belo
13e50 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  w are used to tr
13e60 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
13e70 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
13e80 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e  ity..** TODO -->
13e90 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73   Perhaps this is
13ea0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
13eb0 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
13ec0 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74  d by better.** t
13ed0 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e  able statistics.
13ee0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
13ef0 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68   1:  Estimate th
13f00 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
13f10 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20  ity as 93.75%.  
13f20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61  The 93.75%.** va
13f30 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  lue corresponds 
13f40 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20  to -1 in LogEst 
13f50 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69  notation, so thi
13f60 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e  s means decremen
13f70 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f  t.** the WhereLo
13f80 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f  op.nOut field fo
13f90 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45  r every such WHE
13fa0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  RE clause term..
13fb0 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
13fc0 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69  2:  If there exi
13fd0 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
13fe0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
13ff0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
14000 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20  m "x==EXPR" and 
14010 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f  EXPR is not a co
14020 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74  nstant 0 or 1, t
14030 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68  hen make sure th
14040 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75  e.** final outpu
14050 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69  t row estimate i
14060 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61  s no greater tha
14070 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74  n 1/4 of the tot
14080 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  al number.** of 
14090 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
140a0 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
140b0 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ds, assume that 
140c0 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c  x==EXPR will fil
140d0 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65  ter.** out at le
140e0 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72  ast 3 out of 4 r
140f0 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73  ows.  If EXPR is
14100 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74   -1 or 0 or 1, t
14110 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a  hen maybe the.**
14120 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62   "x" column is b
14130 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d  oolean or else -
14140 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61  1 or 0 or 1 is a
14150 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20   common default 
14160 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  value.** on the 
14170 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  "x" column and s
14180 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f  o in that case o
14190 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70  nly cap the outp
141a0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a  ut row estimate.
141b0 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61  ** at 1/2 instea
141c0 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61  d of 1/4..*/.sta
141d0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
141e0 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a  opOutputAdjust(.
141f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
14200 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  WC,      /* The 
14210 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
14220 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
14230 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op,      /* The 
14240 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64  loop to adjust d
14250 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67  ownward */.  Log
14260 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20  Est nRow        
14270 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14280 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74   rows in the ent
14290 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ire table */.){.
142a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
142b0 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61  rm, *pX;.  Bitma
142c0 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20  sk notAllowed = 
142d0 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c  ~(pLoop->prereq|
142e0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
142f0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
14300 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63  .  LogEst iReduc
14310 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f  e = 0;    /* pLo
14320 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20  op->nOut should 
14330 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d  not exceed nRow-
14340 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73  iReduce */..  as
14350 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
14360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
14370 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
14380 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
14390 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  rm, pTerm=pWC->a
143a0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72  ; i>0; i--, pTer
143b0 6d 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  m++){.    assert
143c0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
143d0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
143e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
143f0 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b  TUAL)!=0 ) break
14400 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
14410 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
14420 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d  oop->maskSelf)==
14430 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14440 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
14450 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c  ereqAll & notAll
14460 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69  owed)!=0 ) conti
14470 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70  nue;.    for(j=p
14480 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  Loop->nLTerm-1; 
14490 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
144a0 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c    pX = pLoop->aL
144b0 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
144c0 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69  f( pX==0 ) conti
144d0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
144e0 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  X==pTerm ) break
144f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
14500 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26  iParent>=0 && (&
14510 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65  pWC->a[pX->iPare
14520 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72  nt])==pTerm ) br
14530 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
14540 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
14550 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
14560 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
14570 20 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68     /* If a truth
14580 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20   probability is 
14590 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20  specified using 
145a0 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
145b0 20 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20   hints,.        
145c0 2a 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  ** then use the 
145d0 70 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76  probability prov
145e0 69 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c  ided by the appl
145f0 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ication. */.    
14600 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
14610 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
14620 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rob;.      }else
14630 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20  {.        /* In 
14640 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65  the absence of e
14650 78 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72  xplicit truth pr
14660 6f 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65  obabilities, use
14670 20 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20   heuristics to. 
14680 20 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20         ** guess 
14690 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75  a reasonable tru
146a0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20  th probability. 
146b0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  */.        pLoop
146c0 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20  ->nOut--;.      
146d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
146e0 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f  erator&(WO_EQ|WO
146f0 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _IS) ){.        
14700 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
14710 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
14720 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
14730 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14740 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
14750 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IS );.          
14760 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
14770 73 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c  sInteger(pRight,
14780 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20   &k) && k>=(-1) 
14790 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20  && k<=1 ){.     
147a0 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20         k = 10;. 
147b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
147c0 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20              k = 
147d0 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  20;.          }.
147e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
147f0 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63  educe<k ) iReduc
14800 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d  e = k;.        }
14810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14820 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
14830 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64  nOut > nRow-iRed
14840 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  uce )  pLoop->nO
14850 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64  ut = nRow - iRed
14860 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  uce;.}../* .** T
14870 65 72 6d 20 70 54 65 72 6d 20 69 73 20 61 20 76  erm pTerm is a v
14880 65 63 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70  ector range comp
14890 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
148a0 2e 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 70  . The first comp
148b0 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  arison.** in the
148c0 20 76 65 63 74 6f 72 20 63 61 6e 20 62 65 20 6f   vector can be o
148d0 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 63  ptimized using c
148e0 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65  olumn nEq of the
148f0 20 69 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20   index. This.** 
14900 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
14910 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
14920 72 20 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d  r of vector elem
14930 65 6e 74 73 20 74 68 61 74 20 63 61 6e 20 62 65  ents that can be
14940 20 75 73 65 64 0a 2a 2a 20 61 73 20 70 61 72 74   used.** as part
14950 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 63 6f   of the range co
14960 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mparison..**.** 
14970 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
14980 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
14990 0a 2a 2a 20 20 20 57 48 45 52 45 20 61 20 3d 20  .**   WHERE a = 
149a0 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20 64 29 20  ? AND (b, c, d) 
149b0 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a  > (?, ?, ?).**.*
149c0 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 3a  * and the index:
149d0 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
149e0 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c  INDEX ... ON (a,
149f0 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a   b, c, d, e).**.
14a00 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
14a10 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69  ction would be i
14a20 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 45 71 3d  nvoked with nEq=
14a30 31 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  1. The value ret
14a40 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73  urned in.** this
14a50 20 63 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73   case is 3..*/.s
14a60 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
14a70 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20  angeVectorLen(. 
14a80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14a90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14aa0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
14ab0 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
14ac0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
14ad0 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49  n on pIdx */.  I
14ae0 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
14af0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
14b00 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
14b10 61 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  a inequality con
14b20 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
14b30 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   nEq,           
14b40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
14b50 72 69 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f  rior equality co
14b60 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d  nstraints on sam
14b70 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  e index */.  Whe
14b80 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20  reTerm *pTerm   
14b90 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 20    /* The vector 
14ba0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
14bb0 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  raint */.){.  in
14bc0 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65 33  t nCmp = sqlite3
14bd0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
14be0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
14bf0 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ft);.  int i;.. 
14c00 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70   nCmp = MIN(nCmp
14c10 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  , (pIdx->nColumn
14c20 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28   - nEq));.  for(
14c30 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b  i=1; i<nCmp; i++
14c40 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 69  ){.    /* Test i
14c50 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f  f comparison i o
14c60 66 20 70 54 65 72 6d 20 69 73 20 63 6f 6d 70 61  f pTerm is compa
14c70 74 69 62 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d  tible with colum
14c80 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a  n (i+nEq) .    *
14c90 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
14ca0 49 66 20 6e 6f 74 2c 20 65 78 69 74 20 74 68 65  If not, exit the
14cb0 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63   loop.  */.    c
14cc0 68 61 72 20 61 66 66 3b 20 20 20 20 20 20 20 20  har aff;        
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ce0 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e  Comparison affin
14cf0 69 74 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ity */.    char 
14d00 69 64 78 61 66 66 20 3d 20 30 3b 20 20 20 20 20  idxaff = 0;     
14d10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14d20 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  xed columns affi
14d30 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  nity */.    Coll
14d40 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
14d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
14d60 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f  parison collatio
14d70 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
14d80 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 70    Expr *pLhs = p
14d90 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
14da0 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  ft->x.pList->a[i
14db0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
14dc0 72 20 2a 70 52 68 73 20 3d 20 70 54 65 72 6d 2d  r *pRhs = pTerm-
14dd0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
14de0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
14df0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
14e00 63 74 20 29 7b 0a 20 20 20 20 20 20 70 52 68 73  ct ){.      pRhs
14e10 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65   = pRhs->x.pSele
14e20 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
14e30 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
14e40 65 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20  e{.      pRhs = 
14e50 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pRhs->x.pList->a
14e60 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
14e70 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
14e80 68 61 74 20 74 68 65 20 4c 48 53 20 6f 66 20 74  hat the LHS of t
14e90 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
14ea0 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
14eb0 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  nce to.    ** th
14ec0 65 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f  e right column o
14ed0 66 20 74 68 65 20 72 69 67 68 74 20 73 6f 75 72  f the right sour
14ee0 63 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 68  ce table. And th
14ef0 61 74 20 74 68 65 20 73 6f 72 74 0a 20 20 20 20  at the sort.    
14f00 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ** order of the 
14f10 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20  index column is 
14f20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
14f30 73 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 74 68  sort order of th
14f40 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73  e.    ** leftmos
14f50 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20  t index column. 
14f60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 68 73   */.    if( pLhs
14f70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
14f80 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69  .     || pLhs->i
14f90 54 61 62 6c 65 21 3d 69 43 75 72 20 0a 20 20 20  Table!=iCur .   
14fa0 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75    || pLhs->iColu
14fb0 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn!=pIdx->aiColu
14fc0 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20  mn[i+nEq] .     
14fd0 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  || pIdx->aSortOr
14fe0 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78  der[i+nEq]!=pIdx
14ff0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
15000 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  ].    ){.      b
15010 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15020 20 74 65 73 74 63 61 73 65 28 20 70 4c 68 73 2d   testcase( pLhs-
15030 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57  >iColumn==XN_ROW
15040 49 44 20 29 3b 0a 20 20 20 20 61 66 66 20 3d 20  ID );.    aff = 
15050 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
15060 66 69 6e 69 74 79 28 70 52 68 73 2c 20 73 71 6c  finity(pRhs, sql
15070 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
15080 28 70 4c 68 73 29 29 3b 0a 20 20 20 20 69 64 78  (pLhs));.    idx
15090 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62  aff = sqlite3Tab
150a0 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  leColumnAffinity
150b0 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70  (pIdx->pTable, p
150c0 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  Lhs->iColumn);. 
150d0 20 20 20 69 66 28 20 61 66 66 21 3d 69 64 78 61     if( aff!=idxa
150e0 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  ff ) break;..   
150f0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
15100 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
15110 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68  lSeq(pParse, pLh
15120 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66  s, pRhs);.    if
15130 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65  ( pColl==0 ) bre
15140 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
15150 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
15160 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
15170 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20  zColl[i+nEq]) ) 
15180 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
15190 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
151a0 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20  Adjust the cost 
151b0 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c  C by the costMul
151c0 74 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69  t facter T.  Thi
151d0 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66  s only occurs if
151e0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  .** compiled wit
151f0 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c  h -DSQLITE_ENABL
15200 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69  E_COSTMULT.*/.#i
15210 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15220 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65  LE_COSTMULT.# de
15230 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75  fine ApplyCostMu
15240 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43  ltiplier(C,T)  C
15250 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65   += T.#else.# de
15260 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75  fine ApplyCostMu
15270 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65  ltiplier(C,T).#e
15280 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68  ndif../*.** We h
15290 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68  ave so far match
152a0 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ed pBuilder->pNe
152b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74  w->u.btree.nEq t
152c0 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  erms of the .** 
152d0 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72  index pIndex. Tr
152e0 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d  y to match one m
152f0 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ore..**.** When 
15300 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15310 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65   called, pBuilde
15320 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f  r->pNew->nOut co
15330 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e  ntains the .** n
15340 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78  umber of rows ex
15350 70 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73  pected to be vis
15360 69 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e  ited by filterin
15370 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20  g using the nEq 
15380 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20  .** terms only. 
15390 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65  If it is modifie
153a0 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  d, this value is
153b0 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
153c0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
153d0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
153e0 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 69 64 78  * If pProbe->idx
153f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
15400 54 59 50 45 5f 49 50 4b 2c 20 74 68 61 74 20 6d  TYPE_IPK, that m
15410 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 0a  eans pIndex is .
15420 2a 2a 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  ** a fake index 
15430 75 73 65 64 20 66 6f 72 20 74 68 65 20 49 4e 54  used for the INT
15440 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
15450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15460 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
15470 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c  eIndex(.  WhereL
15480 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
15490 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  lder,     /* The
154a0 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f   WhereLoop facto
154b0 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ry */.  struct S
154c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
154d0 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  c,      /* FROM 
154e0 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
154f0 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
15500 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20  Index *pProbe,  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
15530 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  Src */.  LogEst 
15540 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
15550 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28           /* log(
15560 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  Number of iterat
15570 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20  ions due to IN) 
15580 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
15590 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
155a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f  lder->pWInfo;  /
155b0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20  * WHERE analyse 
155c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
155d0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
155e0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
155f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15600 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
15610 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
15620 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
15630 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15640 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78  on malloc contex
15650 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
15660 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
15670 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
15680 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64  te WhereLoop und
15690 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
156a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
156b0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
156c0 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54       /* A WhereT
156d0 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64  erm under consid
156e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
156f0 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15710 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20  Valid operators 
15720 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
15730 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  */.  WhereScan s
15740 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  can;            
15750 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
15760 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73   for WHERE terms
15770 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61   */.  Bitmask sa
15780 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20  ved_prereq;     
15790 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
157a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
157b0 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36  >prereq */.  u16
157c0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20   saved_nLTerm;  
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
157e0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
157f0 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a  f pNew->nLTerm *
15800 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45  /.  u16 saved_nE
15810 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
15820 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
15830 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
15840 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20  .btree.nEq */.  
15850 75 31 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20  u16 saved_nBtm; 
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
15880 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
15890 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36  ee.nBtm */.  u16
158a0 20 73 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20   saved_nTop;    
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158c0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
158d0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
158e0 6e 54 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61  nTop */.  u16 sa
158f0 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20  ved_nSkip;      
15900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
15910 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
15920 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20  New->nSkip */.  
15930 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
15940 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
15950 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
15960 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
15970 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
15980 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
15990 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
159a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
159b0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
159c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
159e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
159f0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
15a20 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
15a30 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
15a40 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
15a50 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
15a60 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
15a70 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
15a80 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
15a90 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
15aa0 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
15ab0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
15ac0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
15ad0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
15ae0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
15af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15b00 45 4d 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45  EM_BKPT;.  WHERE
15b10 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 42  TRACE(0x800, ("B
15b20 45 47 49 4e 20 25 73 2e 61 64 64 42 74 72 65 65  EGIN %s.addBtree
15b30 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 5c  Idx(%s), nEq=%d\
15b40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15b50 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d           pProbe-
15b60 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 70  >pTable->zName,p
15b70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  Probe->zName, pN
15b80 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29  ew->u.btree.nEq)
15b90 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
15ba0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
15bb0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
15bc0 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
15bd0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
15be0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
15bf0 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
15c00 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
15c10 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
15c20 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
15c30 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
15c40 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
15c50 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
15c60 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20  .nBtm==0 );.    
15c70 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
15c80 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
15c90 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
15ca0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20  ISNULL|WO_IS;.  
15cb0 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
15cc0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
15cd0 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
15ce0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
15cf0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
15d00 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
15d10 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
15d20 29 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  );..  saved_nEq 
15d30 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
15d40 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74  nEq;.  saved_nBt
15d50 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  m = pNew->u.btre
15d60 65 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f  e.nBtm;.  saved_
15d70 6e 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  nTop = pNew->u.b
15d80 74 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76  tree.nTop;.  sav
15d90 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d  ed_nSkip = pNew-
15da0 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f  >nSkip;.  saved_
15db0 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
15dc0 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
15dd0 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
15de0 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
15df0 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
15e00 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
15e10 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
15e20 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  ;.  pTerm = wher
15e30 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
15e40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
15e50 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73  pSrc->iCursor, s
15e60 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20  aved_nEq,.      
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65    opMask, pProbe
15e90 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  );.  pNew->rSetu
15ea0 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d  p = 0;.  rSize =
15eb0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15ec0 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53  gEst[0];.  rLogS
15ed0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
15ee0 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d  ze);.  for(; rc=
15ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
15f00 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
15f10 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
15f20 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65  can)){.    u16 e
15f30 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Op = pTerm->eOpe
15f40 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72  rator;   /* Shor
15f50 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d  thand for pTerm-
15f60 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
15f70 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64    LogEst rCostId
15f80 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f  x;.    LogEst nO
15f90 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20  utUnadjusted;   
15fa0 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66       /* nOut bef
15fb0 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45  ore IN() and WHE
15fc0 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a  RE adjustments *
15fd0 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  /.    int nIn = 
15fe0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15ff0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
16000 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
16010 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
16020 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
16030 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
16040 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
16050 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
16060 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
16070 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
16080 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65  ull(pProbe, save
16090 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  d_nEq).    ){.  
160a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
160b0 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
160c0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
160d0 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
160e0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
160f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
16100 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
16110 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
16120 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
16130 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
16140 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61  upper bound of a
16150 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
16160 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
16170 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69  int.    ** to mi
16180 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72  x with a lower r
16190 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20  ange bound from 
161a0 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63  some other sourc
161b0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  e */.    if( pTe
161c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
161d0 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54  RM_LIKEOPT && pT
161e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
161f0 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65  WO_LT ) continue
16200 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ;..    /* Do not
16210 20 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e   allow constrain
16220 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52  ts from the WHER
16230 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75  E clause to be u
16240 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  sed by the.    *
16250 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  * right table of
16260 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f   a LEFT JOIN.  O
16270 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nly constraints 
16280 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
16290 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f   are.    ** allo
162a0 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  wed */.    if( (
162b0 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  pSrc->fg.jointyp
162c0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
162d0 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
162e0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
162f0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
16300 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  in).    ){.     
16310 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
16320 0a 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69 71  ..    if( IsUniq
16330 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20  ueIndex(pProbe) 
16340 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
16350 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20  robe->nKeyCol-1 
16360 29 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65  ){.      pBuilde
16370 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53  r->bldFlags |= S
16380 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55  QLITE_BLDF_UNIQU
16390 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
163a0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c      pBuilder->bl
163b0 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  dFlags |= SQLITE
163c0 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20  _BLDF_INDEXED;. 
163d0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77     }.    pNew->w
163e0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
163f0 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
16400 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
16410 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
16420 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
16430 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a  m = saved_nBtm;.
16440 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
16450 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e  e.nTop = saved_n
16460 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  Top;.    pNew->n
16470 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
16480 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
16490 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
164a0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
164b0 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
164c0 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
164d0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
164e0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
164f0 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
16500 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
16510 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
16520 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
16530 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a  New->maskSelf;..
16540 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d      assert( nInM
16550 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c  ul==0.        ||
16560 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
16570 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
16580 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20  ULL)!=0 .       
16590 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
165a0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
165b0 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20  N_IN)!=0 .      
165c0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
165d0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
165e0 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b  SCAN)!=0 .    );
165f0 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20  ..    if( eOp & 
16600 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  WO_IN ){.      E
16610 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
16620 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
16630 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16640 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
16650 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
16660 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
16670 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
16680 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
16690 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
166a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
166b0 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  i;.        nIn =
166c0 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
166d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
166e0 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  25) );..        
166f0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
16700 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  n may actually b
16710 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78  e of the form (x
16720 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  , y) IN (SELECT.
16730 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ..)..        ** 
16740 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
16750 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65  re is a separate
16760 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f   term for each o
16770 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20  f (x) and (y).. 
16780 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
16790 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69  r, the nIn multi
167a0 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c  plier should onl
167b0 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63  y be applied onc
167c0 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20  e, not once.    
167d0 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
167e0 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66  such term. The f
167f0 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68  ollowing loop ch
16800 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20  ecks that pTerm 
16810 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  is the.        *
16820 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72  * first such ter
16830 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65  m in use, and se
16840 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30  ts nIn back to 0
16850 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a   if it is not. *
16860 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
16870 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72  0; i<pNew->nLTer
16880 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m-1; i++){.     
16890 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61       if( pNew->a
168a0 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77  LTerm[i] && pNew
168b0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
168c0 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20  pr==pExpr ) nIn 
168d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
168e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
168f0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
16900 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
16910 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
16920 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
16930 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
16940 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
16950 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
16960 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
16970 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
16980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16990 20 70 50 72 6f 62 65 2d 3e 68 61 73 53 74 61 74   pProbe->hasStat
169a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67  1 ){.        Log
169b0 45 73 74 20 4d 2c 20 6c 6f 67 4b 2c 20 73 61 66  Est M, logK, saf
169c0 65 74 79 4d 61 72 67 69 6e 3b 0a 20 20 20 20 20  etyMargin;.     
169d0 20 20 20 2f 2a 20 4c 65 74 3a 0a 20 20 20 20 20     /* Let:.     
169e0 20 20 20 2a 2a 20 20 20 4e 20 3d 20 74 68 65 20     **   N = the 
169f0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
16a00 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
16a10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4b  e.        **   K
16a20 20 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   = the number of
16a30 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20   entries on the 
16a40 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
16a50 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  erator.        *
16a60 2a 20 20 20 4d 20 3d 20 74 68 65 20 6e 75 6d 62  *   M = the numb
16a70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
16a80 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
16a90 63 68 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ch terms to the 
16aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
16ab0 20 20 74 6f 20 74 68 65 20 6c 65 66 74 20 69 6e    to the left in
16ac0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e   the same index.
16ad0 20 20 49 66 20 74 68 65 20 49 4e 20 6f 70 65 72    If the IN oper
16ae0 61 74 6f 72 20 69 73 20 6f 6e 0a 20 20 20 20 20  ator is on.     
16af0 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20     **       the 
16b00 6c 65 66 74 2d 6d 6f 73 74 20 69 6e 64 65 78 20  left-most index 
16b10 63 6f 6c 75 6d 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20  column, M==N..  
16b20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
16b30 20 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 64 65   ** Given the de
16b40 66 69 6e 69 74 69 6f 6e 73 20 61 62 6f 76 65 2c  finitions above,
16b50 20 69 74 20 69 73 20 62 65 74 74 65 72 20 74 6f   it is better to
16b60 20 6f 6d 69 74 20 74 68 65 20 49 4e 20 6f 70 65   omit the IN ope
16b70 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  rator.        **
16b80 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
16b90 6c 6f 6f 6b 75 70 20 61 6e 64 20 69 6e 73 74 65  lookup and inste
16ba0 61 64 20 64 6f 20 61 20 73 63 61 6e 20 6f 66 20  ad do a scan of 
16bb0 74 68 65 20 4d 20 65 6c 65 6d 65 6e 74 73 2c 0a  the M elements,.
16bc0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 69          ** testi
16bd0 6e 67 20 65 61 63 68 20 73 63 61 6e 6e 65 64 20  ng each scanned 
16be0 72 6f 77 20 61 67 61 69 6e 73 74 20 74 68 65 20  row against the 
16bf0 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 65 70 61  IN operator sepa
16c00 72 61 74 65 6c 79 2c 20 69 66 3a 0a 20 20 20 20  rately, if:.    
16c10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16c20 2a 20 20 20 20 20 20 20 20 4d 2a 6c 6f 67 28 4b  *        M*log(K
16c30 29 20 3c 20 4b 2a 6c 6f 67 28 4e 29 0a 20 20 20  ) < K*log(N).   
16c40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16c50 2a 2a 20 4f 75 72 20 65 73 74 69 6d 61 74 65 73  ** Our estimates
16c60 20 66 6f 72 20 4d 2c 20 4b 2c 20 61 6e 64 20 4e   for M, K, and N
16c70 20 6d 69 67 68 74 20 62 65 20 69 6e 61 63 63 75   might be inaccu
16c80 72 61 74 65 2c 20 73 6f 20 77 65 20 62 75 69 6c  rate, so we buil
16c90 64 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  d in.        ** 
16ca0 61 20 73 61 66 65 74 79 20 6d 61 72 67 69 6e 20  a safety margin 
16cb0 6f 66 20 32 20 28 4c 6f 67 45 73 74 3a 20 31 30  of 2 (LogEst: 10
16cc0 29 20 74 68 61 74 20 66 61 76 6f 72 73 20 75 73  ) that favors us
16cd0 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ing the IN opera
16ce0 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  tor.        ** w
16cf0 69 74 68 20 74 68 65 20 69 6e 64 65 78 2c 20 61  ith the index, a
16d00 73 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  s using an index
16d10 20 68 61 73 20 62 65 74 74 65 72 20 77 6f 72 73   has better wors
16d20 74 2d 63 61 73 65 20 62 65 68 61 76 69 6f 72 2e  t-case behavior.
16d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77  .        ** If w
16d40 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 72 65  e do not have re
16d50 61 6c 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  al sqlite_stat1 
16d60 64 61 74 61 2c 20 61 6c 77 61 79 73 20 70 72 65  data, always pre
16d70 66 65 72 20 74 6f 20 75 73 65 0a 20 20 20 20 20  fer to use.     
16d80 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e     ** the index.
16d90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16da0 20 20 20 20 4d 20 3d 20 70 50 72 6f 62 65 2d 3e      M = pProbe->
16db0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
16dc0 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20  d_nEq];.        
16dd0 6c 6f 67 4b 20 3d 20 65 73 74 4c 6f 67 28 6e 49  logK = estLog(nI
16de0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 61 66 65  n);.        safe
16df0 74 79 4d 61 72 67 69 6e 20 3d 20 31 30 3b 20 20  tyMargin = 10;  
16e00 2f 2a 20 54 55 4e 49 4e 47 3a 20 65 78 74 72 61  /* TUNING: extra
16e10 20 77 65 69 67 68 74 20 66 6f 72 20 69 6e 64 65   weight for inde
16e20 78 65 64 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  xed IN */.      
16e30 20 20 69 66 28 20 4d 20 2b 20 6c 6f 67 4b 20 2b    if( M + logK +
16e40 20 73 61 66 65 74 79 4d 61 72 67 69 6e 20 3c 20   safetyMargin < 
16e50 6e 49 6e 20 2b 20 72 4c 6f 67 53 69 7a 65 20 29  nIn + rLogSize )
16e60 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  {.          WHER
16e70 45 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20  ETRACE(0x40,.   
16e80 20 20 20 20 20 20 20 20 20 28 22 53 63 61 6e 20           ("Scan 
16e90 70 72 65 66 65 72 72 65 64 20 6f 76 65 72 20 49  preferred over I
16ea0 4e 20 6f 70 65 72 61 74 6f 72 20 6f 6e 20 63 6f  N operator on co
16eb0 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c  lumn %d of \"%s\
16ec0 22 20 28 25 64 3c 25 64 29 5c 6e 22 2c 0a 20 20  " (%d<%d)\n",.  
16ed0 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64             saved
16ee0 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  _nEq, pProbe->zN
16ef0 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20  ame, M+logK+10, 
16f00 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a  nIn+rLogSize));.
16f10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
16f20 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ue;.        }els
16f30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  e{.          WHE
16f40 52 45 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20  RETRACE(0x40,.  
16f50 20 20 20 20 20 20 20 20 20 20 28 22 49 4e 20 6f            ("IN o
16f60 70 65 72 61 74 6f 72 20 70 72 65 66 65 72 72 65  perator preferre
16f70 64 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f  d on column %d o
16f80 66 20 5c 22 25 73 5c 22 20 28 25 64 3e 3d 25 64  f \"%s\" (%d>=%d
16f90 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
16fa0 20 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50     saved_nEq, pP
16fb0 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c  robe->zName, M+l
16fc0 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67  ogK+10, nIn+rLog
16fd0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
16fe0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16ff0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
17000 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
17010 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17020 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
17030 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  IS) ){.      int
17040 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
17050 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e  aiColumn[saved_n
17060 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Eq];.      pNew-
17070 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
17080 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
17090 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64     assert( saved
170a0 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74  _nEq==pNew->u.bt
170b0 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20  ree.nEq );.     
170c0 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f   if( iCol==XN_RO
170d0 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  WID .       || (
170e0 69 43 6f 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d 75  iCol>=0 && nInMu
170f0 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45  l==0 && saved_nE
17100 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
17110 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
17120 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d         if( iCol=
17130 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 72  =XN_ROWID || pPr
17140 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  obe->uniqNotNull
17150 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70   .         || (p
17160 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d  Probe->nKeyCol==
17170 31 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45  1 && pProbe->onE
17180 72 72 6f 72 20 26 26 20 65 4f 70 3d 3d 57 4f 5f  rror && eOp==WO_
17190 45 51 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  EQ) .        ){.
171a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
171b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
171c0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20  _ONEROW;.       
171d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
171e0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
171f0 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
17200 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  TED;.        }. 
17210 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17220 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
17230 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
17240 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
17250 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
17260 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17270 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
17280 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
17290 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
172a0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
172b0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
172c0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
172d0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
172e0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
172f0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
17300 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
17310 72 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65  ree.nBtm = where
17320 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a  RangeVectorLen(.
17330 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
17340 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
17350 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e   pProbe, saved_n
17360 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20  Eq, pTerm.      
17370 29 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  );.      pBtm = 
17380 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
17390 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
173a0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
173b0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
173c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e  {.        /* Ran
173d0 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68  ge contraints th
173e0 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65  at come from the
173f0 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
17400 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  on are.        *
17410 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e  * always used in
17420 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20   pairs. */.     
17430 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d     pTop = &pTerm
17440 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
17450 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72  ert( (pTop-(pTer
17460 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72  m->pWC->a))<pTer
17470 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b  m->pWC->nTerm );
17480 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17490 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26   pTop->wtFlags &
174a0 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b   TERM_LIKEOPT );
174b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
174c0 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72   pTop->eOperator
174d0 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==WO_LT );.     
174e0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
174f0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
17500 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
17510 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
17520 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
17530 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
17540 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b  LTerm++] = pTop;
17550 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
17560 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
17570 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
17580 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
17590 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  .nTop = 1;.     
175a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
175b0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
175c0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
175d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
175e0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29  e( eOp & WO_LT )
175f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17600 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b  ( eOp & WO_LE );
17610 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
17620 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
17630 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
17640 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
17650 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17660 6e 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67  nTop = whereRang
17670 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20  eVectorLen(.    
17680 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
17690 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  rc->iCursor, pPr
176a0 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  obe, saved_nEq, 
176b0 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20  pTerm.      );. 
176c0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
176d0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
176e0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
176f0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
17700 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
17710 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
17720 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
17730 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
17740 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
17750 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
17760 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
17770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17780 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
17790 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
177a0 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
177b0 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
177c0 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
177d0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
177e0 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
177f0 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
17800 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
17810 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
17820 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
17830 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
17840 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
17850 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
17860 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
17870 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
17880 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
17890 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
178a0 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
178b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
178c0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
178d0 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
178e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
178f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
17900 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
17910 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
17920 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
17930 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
17940 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61  tat4.      ** da
17950 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f  ta, using some o
17960 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20  ther estimate.  
17970 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  */.      whereRa
17980 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
17990 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74  e, pBuilder, pBt
179a0 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a  m, pTop, pNew);.
179b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
179c0 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65   int nEq = ++pNe
179d0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
179e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
179f0 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
17a00 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
17a10 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ) );..      asse
17a20 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
17a30 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
17a40 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
17a50 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70  ruthProb<=0 && p
17a60 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
17a70 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b  saved_nEq]>=0 ){
17a80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17a90 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
17aa0 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
17ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
17ac0 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
17ad0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
17ae0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
17af0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
17b00 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
17b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
17b20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17b30 45 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20  E_STAT4.        
17b40 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
17b50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49  ;.        if( nI
17b60 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20  nMul==0 .       
17b70 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
17b80 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26  mple .         &
17b90 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
17ba0 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61  nEq<=pProbe->nSa
17bb0 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20  mpleCol.        
17bc0 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49   && ((eOp & WO_I
17bd0 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61  N)==0 || !ExprHa
17be0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
17bf0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
17c00 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 20  lect)).         
17c10 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
17c20 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
17c30 45 5f 53 74 61 74 34 29 0a 20 20 20 20 20 20 20  E_Stat4).       
17c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
17c50 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
17c60 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
17c70 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28      if( (eOp & (
17c80 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
17c90 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20 20  WO_IS))!=0 ){.  
17ca0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
17cb0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20  se( eOp & WO_EQ 
17cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
17cd0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
17ce0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
17cf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
17d00 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  p & WO_ISNULL );
17d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17d20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
17d30 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
17d40 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  lder, pExpr->pRi
17d50 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ght, &nOut);.   
17d60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
17d70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
17d80 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
17d90 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
17da0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
17db0 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
17dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
17dd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
17de0 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
17df0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
17e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17e10 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20  _OK ) break;    
17e20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75        /* Jump ou
17e30 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c  t of the pTerm l
17e40 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oop */.         
17e50 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20   if( nOut ){.   
17e60 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17e70 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
17e80 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20  Est(nOut);.     
17e90 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
17ea0 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74  >nOut>saved_nOut
17eb0 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20   ) pNew->nOut = 
17ec0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
17ed0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17ee0 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
17ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75  .        if( nOu
17f10 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20  t==0 ).#endif.  
17f20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
17f30 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
17f40 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f  (pProbe->aiRowLo
17f50 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f  gEst[nEq] - pPro
17f60 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
17f70 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  nEq-1]);.       
17f80 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
17f90 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
17fa0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
17fb0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
17fc0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c  likelihood() val
17fd0 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ue, assume that 
17fe0 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  a .            *
17ff0 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20  * "col IS NULL" 
18000 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
18010 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79  es twice as many
18020 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20   rows .         
18030 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29     ** as (col=?)
18040 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
18050 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31   pNew->nOut += 1
18060 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
18070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18080 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
18090 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74  et rCostIdx to t
180a0 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
180b0 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77  ing selected row
180c0 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a  s in index. Add.
180d0 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65      ** it to pNe
180e0 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69  w->rRun, which i
180f0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
18100 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  to the cost of t
18110 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  he index.    ** 
18120 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c  seek only. Then,
18130 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   if this is a no
18140 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
18150 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  , add the cost o
18160 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e  f.    ** visitin
18170 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  g the rows in th
18180 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a  e main table.  *
18190 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
181a0 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52  rc->pTab->szTabR
181b0 6f 77 3e 30 20 29 3b 0a 20 20 20 20 72 43 6f 73  ow>0 );.    rCos
181c0 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  tIdx = pNew->nOu
181d0 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  t + 1 + (15*pPro
181e0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53  be->szIdxRow)/pS
181f0 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52  rc->pTab->szTabR
18200 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ow;.    pNew->rR
18210 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
18220 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20  stAdd(rLogSize, 
18230 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69  rCostIdx);.    i
18240 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
18250 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
18260 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
18270 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
18280 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
18290 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
182a0 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74  rRun, pNew->nOut
182b0 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20   + 16);.    }.  
182c0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
182d0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
182e0 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65  , pProbe->pTable
182f0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20  ->costMult);..  
18300 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64    nOutUnadjusted
18310 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
18320 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
18330 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
18340 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
18350 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
18360 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
18370 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65  utAdjust(pBuilde
18380 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  r->pWC, pNew, rS
18390 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  ize);.    rc = w
183a0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
183b0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
183c0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
183d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
183e0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
183f0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
18400 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
18410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18420 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74  New->nOut = nOut
18430 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20  Unadjusted;.    
18440 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  }..    if( (pNew
18450 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
18460 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a  E_TOP_LIMIT)==0.
18470 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
18480 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
18490 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b  ->nColumn.    ){
184a0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
184b0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
184c0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
184d0 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
184e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
184f0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
18500 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  nOut;.#ifdef SQL
18510 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
18520 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
18530 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
18540 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
18550 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
18560 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
18570 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
18580 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
18590 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
185a0 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
185b0 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  tm;.  pNew->u.bt
185c0 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64  ree.nTop = saved
185d0 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nTop;.  pNew->n
185e0 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
185f0 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ip;.  pNew->wsFl
18600 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
18610 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  ags;.  pNew->nOu
18620 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
18630 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
18640 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a   saved_nLTerm;..
18650 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
18660 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
18670 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
18680 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
18690 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
186a0 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
186b0 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
186c0 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
186d0 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
186e0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
186f0 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
18700 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
18710 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a  s at least 18. .
18720 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    **.  ** The ma
18730 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73  gic number 18 is
18740 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65   selected on the
18750 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e   basis that scan
18760 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a  ning 17 rows.  *
18770 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  * is almost alwa
18780 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20  ys quicker than 
18790 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65  an index seek (e
187a0 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68  ven though if th
187b0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e  e index.  ** con
187c0 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
187d0 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73   2^17 rows we as
187e0 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69  sume otherwise i
187f0 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66  n other parts of
18800 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e  .  ** the code).
18810 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74   And, even if it
18820 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75   is not, it shou
18830 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75  ld not be too mu
18840 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a  ch slower. .  **
18850 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
18860 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65  nd, the extra se
18870 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70  eks could end up
18880 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61   being significa
18890 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65  ntly.  ** more e
188a0 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20  xpensive.  */.  
188b0 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69  assert( 42==sqli
188c0 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b  te3LogEst(18) );
188d0 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71  .  if( saved_nEq
188e0 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
188f0 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
18900 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
18910 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f     && pProbe->no
18920 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26  SkipScan==0.   &
18930 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
18940 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
18950 5f 53 6b 69 70 53 63 61 6e 29 0a 20 20 20 26 26  _SkipScan).   &&
18960 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
18970 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  gEst[saved_nEq+1
18980 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47  ]>=42  /* TUNING
18990 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b  : Minimum for sk
189a0 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26  ip-scan */.   &&
189b0 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70   (rc = whereLoop
189c0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
189d0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
189e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )==SQLITE_OK.  )
189f0 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74  {.    LogEst nIt
18a00 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  er;.    pNew->u.
18a10 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
18a20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a   pNew->nSkip++;.
18a30 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
18a40 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
18a50 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18a60 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
18a70 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e  _SKIPSCAN;.    n
18a80 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Iter = pProbe->a
18a90 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
18aa0 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  _nEq] - pProbe->
18ab0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
18ac0 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e  d_nEq+1];.    pN
18ad0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65  ew->nOut -= nIte
18ae0 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  r;.    /* TUNING
18af0 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72  :  Because uncer
18b00 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20  tainties in the 
18b10 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b  estimates for sk
18b20 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c  ip-scan queries,
18b30 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e  .    ** add a 1.
18b40 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72  375 fudge factor
18b50 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63   to make skip-sc
18b60 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73  an slightly less
18b70 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20   likely. */.    
18b80 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20  nIter += 5;.    
18b90 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
18ba0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
18bb0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
18bc0 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a  Iter + nInMul);.
18bd0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18be0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
18bf0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18c00 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
18c10 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
18c20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
18c30 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
18c40 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
18c50 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54 52  ;.  }..  WHERETR
18c60 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44  ACE(0x800, ("END
18c70 20 25 73 2e 61 64 64 42 74 72 65 65 49 64 78 28   %s.addBtreeIdx(
18c80 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d  %s), nEq=%d, rc=
18c90 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
18cb0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61  obe->pTable->zNa
18cc0 6d 65 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  me, pProbe->zNam
18cd0 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 72 63  e, saved_nEq, rc
18ce0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
18cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18d00 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
18d10 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
18d20 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
18d30 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
18d40 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
18d50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
18d60 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
18d70 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
18d80 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
18d90 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
18da0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
18db0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
18dc0 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
18dd0 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
18de0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
18df0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
18e00 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
18e10 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
18e20 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
18e30 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
18e40 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
18e50 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
18e60 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
18e70 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
18e80 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45   ExprList *aColE
18e90 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  xpr;.  int ii, j
18ea0 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
18eb0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
18ec0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
18ed0 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
18ee0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
18ef0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
18f00 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
18f10 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
18f20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
18f30 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
18f40 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69  SkipCollateAndLi
18f50 6b 65 6c 79 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e  kely(pOB->a[ii].
18f60 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
18f70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
18f80 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
18f90 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
18fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
18fb0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
18fc0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
18fd0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
18fe0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
18ff0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
19000 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
19010 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19020 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
19030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
19040 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72  se if( (aColExpr
19050 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45   = pIndex->aColE
19060 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)!=0 ){.     
19070 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
19080 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
19090 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
190a0 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
190b0 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20  mn[jj]!=XN_EXPR 
190c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
190d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
190e0 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70  xprCompareSkip(p
190f0 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61  Expr,aColExpr->a
19100 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73  [jj].pExpr,iCurs
19110 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  or)==0 ){.      
19120 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19150 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63  rn 0;.}../* Chec
19160 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61  k to see if a pa
19170 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68  rtial index with
19180 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65   pPartIndexWhere
19190 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
191a0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  in the current q
191b0 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72  uery.  Return tr
191c0 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20  ue if it can be 
191d0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
191e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
191f0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
19200 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62  alIndex(int iTab
19210 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
19220 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65  WC, Expr *pWhere
19230 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
19240 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
19250 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
19260 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
19270 50 61 72 73 65 3b 0a 20 20 77 68 69 6c 65 28 20  Parse;.  while( 
19280 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
19290 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77  ND ){.    if( !w
192a0 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
192b0 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c  lIndex(iTab,pWC,
192c0 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29  pWhere->pLeft) )
192d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
192e0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
192f0 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 69 66  pRight;.  }.  if
19300 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
19310 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61  ags & SQLITE_Ena
19320 62 6c 65 51 50 53 47 20 29 20 70 50 61 72 73 65  bleQPSG ) pParse
19330 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
19340 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
19350 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
19360 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
19370 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
19380 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
19390 69 66 28 20 28 21 45 78 70 72 48 61 73 50 72 6f  if( (!ExprHasPro
193a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
193b0 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78  FromJoin) || pEx
193c0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
193d0 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 20  ble==iTab).     
193e0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  && sqlite3ExprIm
193f0 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
19400 2c 20 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  , pExpr, pWhere,
19410 20 69 54 61 62 29 20 0a 20 20 20 20 29 7b 0a 20   iTab) .    ){. 
19420 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19430 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19440 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
19450 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
19460 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69  objects for a si
19470 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68  ngle table of th
19480 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65  e join where the
19490 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
194a0 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c  ntified by pBuil
194b0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
194c0 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
194d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
194e0 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
194f0 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
19500 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
19510 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c  he costs (WhereL
19520 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65  oop.rRun) of the
19530 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64   b-tree loops ad
19540 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ded by this func
19550 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63  tion.** are calc
19560 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
19570 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66  s:.**.** For a f
19580 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69  ull scan, assumi
19590 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72  ng the table (or
195a0 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73   index) contains
195b0 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a   nRow rows:.**.*
195c0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
195d0 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20  w * 3.0         
195e0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75             // fu
195f0 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll-table scan.**
19600 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
19610 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20   * K            
19620 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
19630 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  n of covering in
19640 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
19650 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29  = nRow * (K+3.0)
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63  // scan of non-c
19680 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
19690 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61  .** where K is a
196a0 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
196b0 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62  .1 and 3.0 set b
196c0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61  ased on the rela
196d0 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74  tive .** estimat
196e0 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  ed average size 
196f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
19700 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a   table records..
19710 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64  **.** For an ind
19720 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e  ex scan, where n
19730 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d  Visit is the num
19740 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77  ber of index row
19750 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  s visited.** by 
19760 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53  the scan, and nS
19770 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  eek is the numbe
19780 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74  r of seek operat
19790 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ions required on
197a0 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62   .** the index b
197b0 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  -tree:.**.**    
197c0 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
197d0 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a  (log(nRow) + K *
197e0 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20   nVisit)        
197f0 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e    // covering in
19800 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
19810 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
19820 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a  Row) + (K+3.0) *
19830 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e   nVisit)    // n
19840 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
19850 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  x.**.** Normally
19860 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53  , nSeek is 1. nS
19870 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74  eek values great
19880 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61  er than 1 come a
19890 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20  bout if the .** 
198a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63  WHERE clause inc
198b0 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e  ludes "x IN (...
198c0 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69  .)" terms used i
198d0 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22  n place of "x=?"
198e0 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d  . Or when .** im
198f0 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45  plicit "x IN (SE
19900 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29  LECT x FROM tbl)
19910 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  " terms are adde
19920 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73  d for skip-scans
19930 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
19940 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52  mated values (nR
19950 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65  ow, nVisit, nSee
19960 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e  k) often contain
19970 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a   a large amount.
19980 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74  ** of uncertaint
19990 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  y.  For this rea
199a0 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20  son, scoring is 
199b0 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b  designed to pick
199c0 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22   plans that.** "
199d0 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72  do the least har
199e0 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61  m" if the estima
199f0 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61  tes are inaccura
19a00 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  te.  For example
19a10 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29  , a.** log(nRow)
19a20 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74   factor is omitt
19a30 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f  ed from a non-co
19a40 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
19a50 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  n in order to.**
19a60 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e   bias the scorin
19a70 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73  g in favor of us
19a80 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69  ing an index, si
19a90 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61  nce the worst-ca
19aa0 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  se.** performanc
19ab0 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  e of using an in
19ac0 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65  dex is far bette
19ad0 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74  r than the worst
19ae0 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63  -case performanc
19af0 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74  e.** of a full t
19b00 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  able scan..*/.st
19b10 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
19b20 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
19b30 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
19b40 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
19b50 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
19b60 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
19b70 73 6b 20 6d 50 72 65 72 65 71 20 20 20 20 20 20  sk mPrereq      
19b80 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
19b90 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
19ba0 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
19bb0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
19bc0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
19bd0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
19be0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
19bf0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
19c00 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
19c10 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
19c20 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
19c30 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
19c60 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
19c70 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
19c80 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74   LogEst aiRowEst
19c90 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20  Pk[2];       /* 
19ca0 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b  The aiRowLogEst[
19cb0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
19cc0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
19cd0 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  16 aiColumnPk = 
19ce0 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
19cf0 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
19d00 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
19d10 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
19d20 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
19d30 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
19d40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
19d50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19d60 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
19d70 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
19d80 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
19d90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
19da0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
19db0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
19dc0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
19dd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19de0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
19df0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19e00 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
19e10 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
19e20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
19e30 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e50 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
19e60 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
19e70 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
19e80 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
19e90 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
19ea0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
19eb0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
19ec0 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
19ed0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
19ee0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
19ef0 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
19f00 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
19f10 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
19f20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
19f30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f50 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
19f60 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
19f70 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
19f80 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
19f90 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
19fa0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
19fb0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
19fc0 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
19fd0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
19fe0 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
19ff0 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
1a000 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1a010 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
1a020 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1a030 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
1a040 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20  >pIBIndex ){.   
1a050 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
1a060 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
1a070 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1a080 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
1a090 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
1a0a0 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d  c->pIBIndex;.  }
1a0b0 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77  else if( !HasRow
1a0c0 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
1a0d0 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70  pProbe = pTab->p
1a0e0 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
1a0f0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1a100 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1a110 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
1a120 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
1a130 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
1a140 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
1a150 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1a160 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1a170 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
1a180 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
1a190 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
1a1a0 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
1a1b0 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
1a1c0 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
1a1d0 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
1a1e0 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
1a1f0 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
1a220 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
1a230 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
1a240 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
1a250 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1a260 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20    sPk.nKeyCol = 
1a270 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  1;.    sPk.nColu
1a280 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
1a290 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
1a2a0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
1a2b0 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69  aiRowLogEst = ai
1a2c0 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
1a2d0 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
1a2e0 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
1a2f0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
1a300 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20     sPk.szIdxRow 
1a310 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  = pTab->szTabRow
1a320 3b 0a 20 20 20 20 73 50 6b 2e 69 64 78 54 79 70  ;.    sPk.idxTyp
1a330 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59  e = SQLITE_IDXTY
1a340 50 45 5f 49 50 4b 3b 0a 20 20 20 20 61 69 52 6f  PE_IPK;.    aiRo
1a350 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
1a360 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
1a370 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
1a380 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
1a390 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
1a3a0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
1a3b0 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
1a3c0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
1a3d0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
1a3e0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
1a3f0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
1a400 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
1a410 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
1a420 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
1a430 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
1a440 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1a450 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
1a460 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
1a470 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
1a480 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
1a490 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
1a4a0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
1a4b0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
1a4c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a4d0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
1a4e0 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
1a4f0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
1a500 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
1a510 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61  t      /* Not pa
1a520 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69  rt of an OR opti
1a530 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26  mization */.   &
1a540 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1a550 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
1a560 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
1a570 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
1a580 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1a590 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
1a5a0 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
1a5b0 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20  c->pIBIndex==0  
1a5c0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e      /* Has no IN
1a5d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
1a5e0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
1a5f0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20  fg.notIndexed   
1a600 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e  /* Has no NOT IN
1a610 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a  DEXED clause */.
1a620 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
1a630 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab)         /* 
1a640 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49  Not WITHOUT ROWI
1a650 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a  D table. (FIXME:
1a660 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20   Why not?) */.  
1a670 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
1a680 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
1a690 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
1a6a0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
1a6b0 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63   !pSrc->fg.isRec
1a6c0 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61  ursive  /* Not a
1a6d0 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f   recursive commo
1a6e0 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
1a6f0 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  on. */.  ){.    
1a700 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
1a710 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
1a720 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
1a730 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
1a740 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
1a750 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
1a760 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
1a770 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
1a780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1a790 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
1a7a0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
1a7b0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1a7c0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
1a7d0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
1a7e0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
1a7f0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
1a800 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
1a810 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
1a820 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
1a830 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b         pNew->nSk
1a840 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
1a850 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
1a860 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
1a870 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1a880 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
1a890 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
1a8a0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
1a8b0 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
1a8c0 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
1a8d0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
1a8e0 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
1a8f0 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20     ** estimated 
1a900 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e  to be X*N*log2(N
1a910 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
1a920 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1a930 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
1a940 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
1a950 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20  dexed and where 
1a960 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32  X is 7 (LogEst=2
1a970 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  8) for normal.  
1a980 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
1a990 6f 72 20 30 2e 35 20 28 4c 6f 67 45 73 74 3d 2d  or 0.5 (LogEst=-
1a9a0 31 30 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e  10) for views an
1a9b0 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  d subqueries.  T
1a9c0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
1a9d0 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c   ** of X is smal
1a9e0 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e  ler for views an
1a9f0 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20  d subqueries so 
1aa00 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
1aa10 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a  lanner.        *
1aa20 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61  * will be more a
1aa30 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20  ggressive about 
1aa40 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d  generating autom
1aa50 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72  atic indexes for
1aa60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73  .        ** thos
1aa70 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65  e objects, since
1aa80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70   there is no opp
1aa90 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20  ortunity to add 
1aaa0 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a  schema.        *
1aab0 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62  * indexes on sub
1aac0 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77  queries and view
1aad0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
1aae0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
1aaf0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 3b 0a 20  gSize + rSize;. 
1ab00 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
1ab10 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28  >pSelect==0 && (
1ab20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1ab30 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
1ab40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
1ab50 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32  New->rSetup += 2
1ab60 38 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  8;.        }else
1ab70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1ab80 2d 3e 72 53 65 74 75 70 20 2d 3d 20 31 30 3b 0a  ->rSetup -= 10;.
1ab90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aba0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
1abb0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74  plier(pNew->rSet
1abc0 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  up, pTab->costMu
1abd0 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  lt);.        if(
1abe0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20   pNew->rSetup<0 
1abf0 29 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d  ) pNew->rSetup =
1ac00 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0;.        /* T
1ac10 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
1ac20 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
1ac30 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
1ac40 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
1ac50 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
1ac60 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
1ac70 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
1ac80 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
1ac90 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
1aca0 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73  of knowing how s
1acb0 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
1acc0 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
1acd0 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
1ace0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
1acf0 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
1ad00 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
1ad10 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
1ad20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
1ad30 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
1ad40 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33  ert( 43==sqlite3
1ad50 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20  LogEst(20) );.  
1ad60 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1ad70 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1ad80 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
1ad90 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
1ada0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1adb0 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
1adc0 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
1add0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72  ->prereq = mPrer
1ade0 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
1adf0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
1ae00 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1ae10 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1ae20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1ae30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
1ae40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
1ae50 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
1ae60 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  /..  /* Loop ove
1ae70 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 49  r all indices. I
1ae80 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
1ae90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1aea0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 0a 20 20 2a  , then only .  *
1aeb0 2a 20 63 6f 6e 73 69 64 65 72 20 69 6e 64 65 78  * consider index
1aec0 20 70 50 72 6f 62 65 2e 20 20 2a 2f 0a 20 20 66   pProbe.  */.  f
1aed0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
1aee0 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 0a 20  OK && pProbe; . 
1aef0 20 20 20 20 20 70 50 72 6f 62 65 3d 28 70 53 72       pProbe=(pSr
1af00 63 2d 3e 70 49 42 49 6e 64 65 78 20 3f 20 30 20  c->pIBIndex ? 0 
1af10 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29  : pProbe->pNext)
1af20 2c 20 69 53 6f 72 74 49 64 78 2b 2b 0a 20 20 29  , iSortIdx++.  )
1af30 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
1af40 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
1af50 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
1af60 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
1af70 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
1af80 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
1af90 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
1afa0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1afb0 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
1afc0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
1afd0 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
1afe0 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
1aff0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
1b000 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
1b010 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
1b020 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
1b030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1b040 72 6f 62 65 2d 3e 62 4e 6f 51 75 65 72 79 20 29  robe->bNoQuery )
1b050 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72   continue;.    r
1b060 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
1b070 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
1b080 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
1b090 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e  .nEq = 0;.    pN
1b0a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
1b0b0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1b0c0 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30  u.btree.nTop = 0
1b0d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
1b0e0 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
1b0f0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  >nLTerm = 0;.   
1b100 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1b110 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  = 0;.    pNew->r
1b120 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70  Setup = 0;.    p
1b130 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
1b140 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d  rereq;.    pNew-
1b150 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
1b160 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
1b170 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
1b180 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
1b190 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
1b1a0 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
1b1b0 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
1b1c0 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  sor);.    /* The
1b1d0 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44   ONEPASS_DESIRED
1b1e0 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63   flags never occ
1b1f0 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74  urs together wit
1b200 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  h ORDER BY */.  
1b210 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66    assert( (pWInf
1b220 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1b230 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
1b240 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d  SIRED)==0 || b==
1b250 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  0 );.    if( pPr
1b260 6f 62 65 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51  obe->idxType==SQ
1b270 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b  LITE_IDXTYPE_IPK
1b280 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
1b290 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
1b2a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1b2b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1b2c0 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
1b2d0 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
1b2e0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
1b2f0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
1b300 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
1b310 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
1b320 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
1b330 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a  able scan is (N*
1b340 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  3.0). */.      p
1b350 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
1b360 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70  e + 16;.      Ap
1b370 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
1b380 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
1b390 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1b3a0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
1b3b0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
1b3c0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
1b3d0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1b3e0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1b3f0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1b400 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
1b410 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
1b420 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
1b430 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
1b440 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
1b450 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
1b460 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
1b470 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1b480 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
1b490 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
1b4a0 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
1b4b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b4c0 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
1b4d0 73 65 64 20 26 20 70 50 72 6f 62 65 2d 3e 63 6f  sed & pProbe->co
1b4e0 6c 4e 6f 74 49 64 78 65 64 3b 0a 20 20 20 20 20  lNotIdxed;.     
1b4f0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1b500 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
1b510 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
1b520 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
1b530 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
1b540 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75    }..      /* Fu
1b550 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65  ll scan via inde
1b560 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  x */.      if( b
1b570 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52  .       || !HasR
1b580 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20  owid(pTab).     
1b590 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61    || pProbe->pPa
1b5a0 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
1b5b0 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
1b5c0 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
1b5d0 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
1b5e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50  .         && (pP
1b5f0 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
1b600 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20  Tab->szTabRow). 
1b610 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1b620 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1b630 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
1b640 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
1b650 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
1b660 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
1b670 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
1b680 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
1b690 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
1b6a0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
1b6b0 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
1b6c0 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
1b6d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
1b6e0 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
1b6f0 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20  ortIdx : 0;..   
1b700 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
1b710 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65   of visiting the
1b720 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e   index rows is N
1b730 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20  *K, where K is. 
1b740 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
1b750 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64  n 1.1 and 3.0, d
1b760 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1b770 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
1b780 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1b790 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
1b7a0 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
1b7b0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
1b7c0 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70  Size + 1 + (15*p
1b7d0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
1b7e0 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
1b7f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d  .        if( m!=
1b800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1b810 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e  * If this is a n
1b820 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
1b830 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74  x scan, add in t
1b840 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20  he cost of.     
1b850 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61       ** doing ta
1b860 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68  ble lookups.  Th
1b870 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33  e cost will be 3
1b880 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  x the number of.
1b890 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f            ** loo
1b8a0 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f  kups.  Take into
1b8b0 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63   account WHERE c
1b8c0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
1b8d0 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20   can be.        
1b8e0 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75    ** satisfied u
1b8f0 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
1b900 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f  dex, and that do
1b910 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20   not require a. 
1b920 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
1b930 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20  e lookup. */.   
1b940 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c         LogEst nL
1b950 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20  ookup = rSize + 
1b960 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73  16;  /* Base cos
1b970 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20  t:  N*3 */.     
1b980 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1b990 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20         int iCur 
1b9a0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
1b9b0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1b9c0 43 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26  Clause *pWC2 = &
1b9d0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20  pWInfo->sWC;.   
1b9e0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
1b9f0 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b   ii<pWC2->nTerm;
1ba00 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1ba10 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1ba20 54 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b  Term = &pWC2->a[
1ba30 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii];.           
1ba40 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1ba50 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
1ba60 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43  pTerm->pExpr, iC
1ba70 75 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  ur, pProbe) ){. 
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1ba90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1baa0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
1bab0 20 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76   pTerm can be ev
1bac0 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75  aluated using ju
1bad0 73 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53  st the index.  S
1bae0 6f 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20  o reduce.       
1baf0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65       ** the expe
1bb00 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74  cted number of t
1bb10 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63  able lookups acc
1bb20 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20  ordingly */.    
1bb30 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1bb40 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
1bb50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1bb60 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72   nLookup += pTer
1bb70 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
1bb80 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1bb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
1bba0 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20  Lookup--;.      
1bbb0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1bbc0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1bbd0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e  WO_EQ|WO_IS) ) n
1bbe0 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20  Lookup -= 19;.  
1bbf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bc00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bc10 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65    .          pNe
1bc20 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
1bc30 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
1bc40 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b  >rRun, nLookup);
1bc50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bc60 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
1bc70 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
1bc80 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
1bc90 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  t);.        wher
1bca0 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
1bcb0 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
1bcc0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
1bcd0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1bce0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1bcf0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
1bd00 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
1bd10 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
1bd20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1bd30 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64     }..    pBuild
1bd40 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30  er->bldFlags = 0
1bd50 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
1bd60 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
1bd70 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
1bd80 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20  , pProbe, 0);.  
1bd90 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
1bda0 62 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  bldFlags==SQLITE
1bdb0 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 20 29 7b  _BLDF_INDEXED ){
1bdc0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6e  .      /* If a n
1bdd0 6f 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65 78 20  on-unique index 
1bde0 69 73 20 75 73 65 64 2c 20 6f 72 20 69 66 20 61  is used, or if a
1bdf0 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b   prefix of the k
1be00 65 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ey for.      ** 
1be10 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20  unique index is 
1be20 75 73 65 64 20 28 6d 61 6b 69 6e 67 20 74 68 65  used (making the
1be30 20 69 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e 61   index functiona
1be40 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a  lly non-unique).
1be50 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
1be60 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  e sqlite_stat1 d
1be70 61 74 61 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f  ata becomes impo
1be80 72 74 61 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e  rtant for scorin
1be90 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  g the.      ** p
1bea0 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  lan */.      pTa
1beb0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
1bec0 46 5f 53 74 61 74 73 55 73 65 64 3b 0a 20 20 20  F_StatsUsed;.   
1bed0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1bee0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
1bef0 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
1bf00 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
1bf10 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
1bf20 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
1bf30 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
1bf40 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
1bf50 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
1bf60 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1bf70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1bf80 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  TUALTABLE../*.**
1bf90 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49 6e   Argument pIdxIn
1bfa0 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  fo is already po
1bfb0 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c  pulated with all
1bfc0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
1bfd0 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64  t may.** be used
1bfe0 20 62 79 20 74 68 65 20 76 69 72 74 75 61 6c 20   by the virtual 
1bff0 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
1c000 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e   by pBuilder->pN
1c010 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a  ew->iTab. This.*
1c020 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73  * function marks
1c030 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 6f   a subset of tho
1c040 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75  se constraints u
1c050 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74  sable, invokes t
1c060 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  he.** xBestIndex
1c070 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64 73   method and adds
1c080 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6c   the returned pl
1c090 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  an to pBuilder..
1c0a0 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69  **.** A constrai
1c0b0 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73 61  nt is marked usa
1c0c0 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ble if:.**.**   
1c0d0 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61 62  * Argument mUsab
1c0e0 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  le indicates tha
1c0f0 74 20 69 74 73 20 70 72 65 72 65 71 75 69 73 69  t its prerequisi
1c100 74 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  tes are availabl
1c110 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  e, and.**.**   *
1c120 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f   It is not one o
1c130 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
1c140 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1c150 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20 70   mExclude mask p
1c160 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73 20  assed.**     as 
1c170 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
1c180 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70 72  ent (which in pr
1c190 61 63 74 69 63 65 20 69 73 20 65 69 74 68 65 72  actice is either
1c1a0 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a   WO_IN or 0)..**
1c1b0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50 72  .** Argument mPr
1c1c0 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f  ereq is a mask o
1c1d0 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75  f tables that mu
1c1e0 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65  st be scanned be
1c1f0 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72 74  fore the.** virt
1c200 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75 65  ual table in que
1c210 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72 65  stion. These are
1c220 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 6c   added to the pl
1c230 61 6e 73 20 70 72 65 72 65 71 75 69 73 69 74 65  ans prerequisite
1c240 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 69  s.** before it i
1c250 73 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c  s added to pBuil
1c260 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75  der..**.** Outpu
1c270 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62 49  t parameter *pbI
1c280 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  n is set to true
1c290 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64 64   if the plan add
1c2a0 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a  ed to pBuilder.*
1c2b0 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  * uses one or mo
1c2c0 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20  re WO_IN terms, 
1c2d0 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
1c2e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1c2f0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
1c300 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72  rtualOne(.  Wher
1c310 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
1c320 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61 73  uilder,.  Bitmas
1c330 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20  k mPrereq,      
1c340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1c350 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  k of tables that
1c360 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20 2a   must be used. *
1c370 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73 61  /.  Bitmask mUsa
1c380 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1c390 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75      /* Mask of u
1c3a0 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a  sable tables */.
1c3b0 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c 20    u16 mExclude, 
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65 72    /* Exclude ter
1c3e0 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65 20 6f  ms using these o
1c3f0 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71  perators */.  sq
1c400 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1c410 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a   *pIdxInfo,   /*
1c420 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65 63   Populated objec
1c430 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78  t for xBestIndex
1c440 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69   */.  u16 mNoOmi
1c450 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1c460 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1c470 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73 74  omit these const
1c480 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
1c490 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20 20 20  *pbIn           
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1c4b0 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61 6e  UT: True if plan
1c4c0 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29   uses an IN(...)
1c4d0 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72   op */.){.  Wher
1c4e0 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
1c4f0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1c500 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1c510 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
1c520 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
1c530 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1c540 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
1c550 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49 64  ge *pUsage = pId
1c560 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1c570 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20 69  ntUsage;.  int i
1c580 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a  ;.  int mxTerm;.
1c590 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c5a0 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  E_OK;.  WhereLoo
1c5b0 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  p *pNew = pBuild
1c5c0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73  er->pNew;.  Pars
1c5d0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75 69  e *pParse = pBui
1c5e0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  lder->pWInfo->pP
1c5f0 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20 53  arse;.  struct S
1c600 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1c610 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70  c = &pBuilder->p
1c620 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1c630 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
1c640 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1c650 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
1c660 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73  onstraint;..  as
1c670 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20 26  sert( (mUsable &
1c680 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65 72   mPrereq)==mPrer
1c690 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20  eq );.  *pbIn = 
1c6a0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  0;.  pNew->prere
1c6b0 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20  q = mPrereq;..  
1c6c0 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61 62 6c  /* Set the usabl
1c6d0 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75  e flag on the su
1c6e0 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69  bset of constrai
1c6f0 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64 20 62  nts identified b
1c700 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  y .  ** argument
1c710 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45  s mUsable and mE
1c720 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64  xclude. */.  pId
1c730 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
1c740 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1c750 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
1c760 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1c770 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
1c780 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1c790 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
1c7a0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1c7b0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70  Term = &pWC->a[p
1c7c0 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
1c7d0 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43  fset];.    pIdxC
1c7e0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b  ons->usable = 0;
1c7f0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1c800 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
1c810 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e  Usable)==pTerm->
1c820 70 72 65 72 65 71 52 69 67 68 74 20 0a 20 20 20  prereqRight .   
1c830 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70    && (pTerm->eOp
1c840 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64  erator & mExclud
1c850 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  e)==0.    ){.   
1c860 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
1c870 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ble = 1;.    }. 
1c880 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
1c890 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  ize the output f
1c8a0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c  ields of the sql
1c8b0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c8c0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d  structure */.  m
1c8d0 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
1c8e0 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
1c8f0 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  ])*nConstraint);
1c900 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 49  .  assert( pIdxI
1c910 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1c920 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49  dxStr==0 );.  pI
1c930 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
1c940 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1c950 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
1c960 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1c970 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70  onsumed = 0;.  p
1c980 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1c990 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
1c9a0 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
1c9b0 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  e)2;.  pIdxInfo-
1c9c0 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
1c9d0 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d   25;.  pIdxInfo-
1c9e0 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20  >idxFlags = 0;. 
1c9f0 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73   pIdxInfo->colUs
1ca00 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  ed = (sqlite3_in
1ca10 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65  t64)pSrc->colUse
1ca20 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  d;..  /* Invoke 
1ca30 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1ca40 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  e xBestIndex() m
1ca50 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20  ethod */.  rc = 
1ca60 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
1ca70 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61 62  arse, pSrc->pTab
1ca80 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69  , pIdxInfo);.  i
1ca90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
1caa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53   rc==SQLITE_CONS
1cab0 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
1cac0 2f 2a 20 49 66 20 74 68 65 20 78 42 65 73 74 49  /* If the xBestI
1cad0 6e 64 65 78 20 6d 65 74 68 6f 64 20 72 65 74 75  ndex method retu
1cae0 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rns SQLITE_CONST
1caf0 52 41 49 4e 54 2c 20 74 68 61 74 20 6d 65 61 6e  RAINT, that mean
1cb00 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
1cb10 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 63  the particular c
1cb20 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 70 61  ombination of pa
1cb30 72 61 6d 65 74 65 72 73 20 70 72 6f 76 69 64 65  rameters provide
1cb40 64 20 69 73 20 75 6e 75 73 61 62 6c 65 2e 0a 20  d is unusable.. 
1cb50 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20       ** Make no 
1cb60 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6c  entries in the l
1cb70 6f 6f 70 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  oop table..     
1cb80 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
1cb90 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 20  RACE(0xffff, (" 
1cba0 20 5e 5e 5e 5e 2d 2d 2d 20 6e 6f 6e 2d 76 69 61   ^^^^--- non-via
1cbb0 62 6c 65 20 70 6c 61 6e 20 72 65 6a 65 63 74 65  ble plan rejecte
1cbc0 64 21 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  d!\n"));.      r
1cbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1cbe0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1cbf0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 6d 78 54  n rc;.  }..  mxT
1cc00 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65  erm = -1;.  asse
1cc10 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
1cc20 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
1cc30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1cc40 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20  onstraint; i++) 
1cc50 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
1cc60 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1cc70 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
1cc80 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  ;.  pIdxCons = *
1cc90 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
1cca0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1ccb0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
1ccc0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
1ccd0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1cce0 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
1ccf0 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  ns++){.    int i
1cd00 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 28 69  Term;.    if( (i
1cd10 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
1cd20 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
1cd30 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
1cd40 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
1cd50 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49 64 78      int j = pIdx
1cd60 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
1cd70 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  t;.      if( iTe
1cd80 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
1cd90 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
1cda0 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
1cdb0 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20  nTerm.       || 
1cdc0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
1cdd0 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  rm]!=0.       ||
1cde0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
1cdf0 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  e==0.      ){.  
1ce00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ce10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
1ce20 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66  .xBestIndex malf
1ce30 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70  unction",pSrc->p
1ce40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1ce50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ce60 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1ce70 72 65 65 49 64 78 53 74 72 20 29 3b 0a 20 20 20  reeIdxStr );.   
1ce80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ce90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1cea0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1ceb0 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
1cec0 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
1ced0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
1cee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cef0 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
1cf00 31 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  1 );.      pTerm
1cf10 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
1cf20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1cf30 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
1cf40 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  eqRight;.      a
1cf50 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65  ssert( iTerm<pNe
1cf60 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
1cf70 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1cf80 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
1cf90 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
1cfa0 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
1cfb0 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74  = iTerm;.      t
1cfc0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1cfd0 31 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  15 );.      test
1cfe0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
1cff0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  );.      if( iTe
1d000 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
1d010 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
1d020 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
1d030 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
1d040 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1d050 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1d060 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d070 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
1d080 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
1d090 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
1d0a0 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
1d0b0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d         ** consum
1d0c0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
1d0d0 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31  lause because (1
1d0e0 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  ) the order of I
1d0f0 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20  N terms.        
1d100 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
1d110 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
1d120 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
1d130 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
1d140 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
1d150 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
1d160 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
1d170 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
1d180 65 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  erge.        ** 
1d190 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
1d1a0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1d1b0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
1d1c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64  = 0;.        pId
1d1d0 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1d1e0 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58  &= ~SQLITE_INDEX
1d1f0 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20  _SCAN_UNIQUE;.  
1d200 20 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b        *pbIn = 1;
1d210 20 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75   assert( (mExclu
1d220 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  de & WO_IN)==0 )
1d230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d240 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74    }.  pNew->u.vt
1d250 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d 20 7e  ab.omitMask &= ~
1d260 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65 77  mNoOmit;..  pNew
1d270 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
1d280 6d 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m+1;.  for(i=0; 
1d290 69 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b 2b 29 7b  i<=mxTerm; i++){
1d2a0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  .    if( pNew->a
1d2b0 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 7b 0a 20  LTerm[i]==0 ){. 
1d2c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 6e 2d       /* The non-
1d2d0 7a 65 72 6f 20 61 72 67 76 49 64 78 20 76 61 6c  zero argvIdx val
1d2e0 75 65 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 74  ues must be cont
1d2f0 69 67 75 6f 75 73 2e 20 20 52 61 69 73 65 20 61  iguous.  Raise a
1d300 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  n.      ** error
1d310 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
1d320 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1d330 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d340 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20  ,"%s.xBestIndex 
1d350 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72  malfunction",pSr
1d360 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  c->pTab->zName);
1d370 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d380 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1d390 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a 20  oFreeIdxStr );. 
1d3a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d3b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1d3c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
1d3d0 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
1d3e0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e  ->nLSlot );.  pN
1d3f0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
1d400 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
1d410 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  xNum;.  pNew->u.
1d420 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1d430 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1d440 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 70 49  FreeIdxStr;.  pI
1d450 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
1d460 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
1d470 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1d480 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
1d490 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e  idxStr;.  pNew->
1d4a0 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
1d4b0 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f   = (i8)(pIdxInfo
1d4c0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1d4d0 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78 49 6e  d ?.      pIdxIn
1d4e0 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30  fo->nOrderBy : 0
1d4f0 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  );.  pNew->rSetu
1d500 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  p = 0;.  pNew->r
1d510 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1d520 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
1d530 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1d540 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  dCost);.  pNew->
1d550 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
1d560 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65  gEst(pIdxInfo->e
1d570 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a  stimatedRows);..
1d580 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48 45    /* Set the WHE
1d590 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69  RE_ONEROW flag i
1d5a0 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
1d5b0 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63 61  () method indica
1d5c0 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ted.  ** that th
1d5d0 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69  e scan will visi
1d5e0 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f  t at most one ro
1d5f0 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68 65  w. Clear it othe
1d600 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  rwise. */.  if( 
1d610 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1d620 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45  gs & SQLITE_INDE
1d630 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b  X_SCAN_UNIQUE ){
1d640 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
1d650 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
1d660 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OW;.  }else{.   
1d670 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
1d680 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  = ~WHERE_ONEROW;
1d690 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72  .  }.  rc = wher
1d6a0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1d6b0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69  lder, pNew);.  i
1d6c0 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
1d6d0 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
1d6e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1d6f0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1d700 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  );.    pNew->u.v
1d710 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1d720 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  ;.  }.  WHERETRA
1d730 43 45 28 30 78 66 66 66 66 2c 20 28 22 20 20 62  CE(0xffff, ("  b
1d740 49 6e 3d 25 64 20 70 72 65 72 65 71 49 6e 3d 25  In=%d prereqIn=%
1d750 30 34 6c 6c 78 20 70 72 65 72 65 71 4f 75 74 3d  04llx prereqOut=
1d760 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20  %04llx\n",.     
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74 65 33   *pbIn, (sqlite3
1d790 5f 75 69 6e 74 36 34 29 6d 50 72 65 72 65 71 2c  _uint64)mPrereq,
1d7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7b0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1d7c0 75 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e 70 72  uint64)(pNew->pr
1d7d0 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1d7e0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1d7f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1d800 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1d810 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 77 69 74 68  nvoked from with
1d820 69 6e 20 61 6e 20 78 42 65 73 74 49 6e 64 65 78  in an xBestIndex
1d830 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20 69 74 0a  () callback, it.
1d840 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
1d850 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1d860 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1d870 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c  name of the coll
1d880 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63  ation.** sequenc
1d890 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1d8a0 68 20 65 6c 65 6d 65 6e 74 20 69 43 6f 6e 73 20  h element iCons 
1d8b0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
1d8c0 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f 6e 73 74  ndex_info.aConst
1d8d0 72 61 69 6e 74 0a 2a 2a 20 61 72 72 61 79 2e 20  raint.** array. 
1d8e0 4f 72 2c 20 69 66 20 69 43 6f 6e 73 20 69 73 20  Or, if iCons is 
1d8f0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20  out of range or 
1d900 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63 74 69  there is no acti
1d910 76 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a  ve xBestIndex.**
1d920 20 63 61 6c 6c 2c 20 72 65 74 75 72 6e 20 4e 55   call, return NU
1d930 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  LL..*/.const cha
1d940 72 20 2a 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  r *sqlite3_vtab_
1d950 63 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c 69 74 65  collation(sqlite
1d960 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
1d970 64 78 49 6e 66 6f 2c 20 69 6e 74 20 69 43 6f 6e  dxInfo, int iCon
1d980 73 29 7b 0a 20 20 48 69 64 64 65 6e 49 6e 64 65  s){.  HiddenInde
1d990 78 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 20 3d  xInfo *pHidden =
1d9a0 20 28 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66   (HiddenIndexInf
1d9b0 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  o*)&pIdxInfo[1];
1d9c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d9d0 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Ret = 0;.  if( i
1d9e0 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f 6e 73  Cons>=0 && iCons
1d9f0 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
1da00 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 43 6f  traint ){.    Co
1da10 6c 6c 53 65 71 20 2a 70 43 20 3d 20 30 3b 0a 20  llSeq *pC = 0;. 
1da20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 70     int iTerm = p
1da30 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1da40 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54 65 72  aint[iCons].iTer
1da50 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 45 78 70  mOffset;.    Exp
1da60 72 20 2a 70 58 20 3d 20 70 48 69 64 64 65 6e 2d  r *pX = pHidden-
1da70 3e 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70  >pWC->a[iTerm].p
1da80 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 58  Expr;.    if( pX
1da90 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
1daa0 20 70 43 20 3d 20 73 71 6c 69 74 65 33 42 69 6e   pC = sqlite3Bin
1dab0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1dac0 71 28 70 48 69 64 64 65 6e 2d 3e 70 50 61 72 73  q(pHidden->pPars
1dad0 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
1dae0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
1daf0 0a 20 20 20 20 7a 52 65 74 20 3d 20 28 70 43 20  .    zRet = (pC 
1db00 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71  ? pC->zName : sq
1db10 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 29 3b  lite3StrBINARY);
1db20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
1db30 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  et;.}../*.** Add
1db40 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
1db50 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
1db60 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
1db70 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
1db80 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
1db90 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
1dba0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
1dbb0 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
1dbc0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
1dbd0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46  there are no LEF
1dbe0 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20  T or CROSS JOIN 
1dbf0 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65  joins in the que
1dc00 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71  ry, both mPrereq
1dc10 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
1dc20 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
1dc30 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72  Otherwise, mPrer
1dc40 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20  eq is a mask of 
1dc50 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  all FROM clause.
1dc60 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
1dc70 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
1dc80 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1dc90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1dca0 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70  e and are.** sep
1dcb0 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
1dcc0 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
1dcd0 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1dce0 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68  N. Similarly, th
1dcf0 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d  e.** mUnusable m
1dd00 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ask contains all
1dd10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
1dd20 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
1dd30 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72  after the.** vir
1dd40 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61  tual table and a
1dd50 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  re separated fro
1dd60 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1dd70 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a   one LEFT or .**
1dd80 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a   CROSS JOIN. .**
1dd90 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1dda0 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65   if the query we
1ddb0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  re:.**.**   ... 
1ddc0 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54  FROM t1, t2 LEFT
1ddd0 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74   JOIN t3, t4, vt
1dde0 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20   CROSS JOIN t5, 
1ddf0 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d  t6;.**.** then m
1de00 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e  Prereq correspon
1de10 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61  ds to (t1, t2) a
1de20 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20  nd mUnusable to 
1de30 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20  (t5, t6)..**.** 
1de40 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69  All the tables i
1de50 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62  n mPrereq must b
1de60 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1de70 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1de80 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
1de90 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
1dea0 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
1deb0 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
1dec0 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50  isfied by .** mP
1ded0 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70 65  rereq may be spe
1dee0 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
1def0 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
1df00 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
1df10 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
1df20 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
1df30 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
1df40 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
1df50 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
1df60 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
1df70 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1df80 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
1df90 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
1dfa0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
1dfb0 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
1dfc0 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
1dfd0 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
1dfe0 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
1dff0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1e000 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
1e010 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1e020 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
1e030 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
1e040 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
1e050 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20  mask mPrereq,   
1e060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1e070 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1e080 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1e090 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
1e0a0 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1e0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1e0c0 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1e0d0 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1e0e0 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
1e0f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e100 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1e110 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e120 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1e130 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
1e140 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
1e150 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
1e160 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e180 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1e190 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1e1a0 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
1e1b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1e1c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1e1d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e1e0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
1e1f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1e200 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1e210 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1e220 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a  nfo *p;       /*
1e230 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20   Object to pass 
1e240 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1e250 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  */.  int nConstr
1e260 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1e270 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1e280 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20  onstraints in p 
1e290 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20  */.  int bIn;   
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61    /* True if pla
1e2c0 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f  n uses IN(...) o
1e2d0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65  perator */.  Whe
1e2e0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1e2f0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20  Bitmask mBest;  
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e310 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62  Tables used by b
1e320 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  est possible pla
1e330 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  n */.  u16 mNoOm
1e340 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  it;..  assert( (
1e350 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61  mPrereq & mUnusa
1e360 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49  ble)==0 );.  pWI
1e370 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1e380 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
1e390 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1e3a0 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  e;.  pWC = pBuil
1e3b0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
1e3c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1e3d0 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
1e3e0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1e3f0 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
1e400 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
1e410 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
1e420 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49  .  p = allocateI
1e430 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
1e440 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c   pWC, mUnusable,
1e450 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
1e460 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
1e470 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69    &mNoOmit);.  i
1e480 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1e490 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1e4a0 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  PT;.  pNew->rSet
1e4b0 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
1e4c0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1e4d0 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
1e4e0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
1e4f0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1e500 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1e510 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1e520 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
1e530 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
1e540 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  size(pParse->db,
1e550 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
1e560 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
1e570 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1e580 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74  >db, p);.    ret
1e590 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e5a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1e5b0 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73   First call xBes
1e5c0 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1e5d0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73  l constraints us
1e5e0 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45  able. */.  WHERE
1e5f0 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 42  TRACE(0x800, ("B
1e600 45 47 49 4e 20 25 73 2e 61 64 64 56 69 72 74 75  EGIN %s.addVirtu
1e610 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  al()\n", pSrc->p
1e620 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
1e630 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1e640 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1e650 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29   all usable\n"))
1e660 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  ;.  rc = whereLo
1e670 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1e680 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1e690 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70  q, ALLBITS, 0, p
1e6a0 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1e6b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1e6c0 61 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64 65  all to xBestInde
1e6d0 78 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65 72  x() with all ter
1e6e0 6d 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64 75  ms enabled produ
1e6f0 63 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a 20  ced a plan.  ** 
1e700 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
1e710 71 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63 65  quire any source
1e720 20 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61 20   tables (IOW: a 
1e730 70 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74 3d  plan with mBest=
1e740 3d 30 29 0a 20 20 2a 2a 20 61 6e 64 20 64 6f 65  =0).  ** and doe
1e750 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28  s not use an IN(
1e760 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2c 20 74  ...) operator, t
1e770 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
1e780 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20  point in making 
1e790 0a 20 20 2a 2a 20 61 6e 79 20 66 75 72 74 68 65  .  ** any furthe
1e7a0 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  r calls to xBest
1e7b0 49 6e 64 65 78 28 29 20 73 69 6e 63 65 20 74 68  Index() since th
1e7c0 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75  ey will all retu
1e7d0 72 6e 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  rn the same.  **
1e7e0 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20   result (if the 
1e7f0 78 42 65 73 74 49 6e 64 65 78 28 29 20 69 6d 70  xBestIndex() imp
1e800 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73  lementation is s
1e810 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ane). */.  if( r
1e820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e830 28 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77 2d  ((mBest = (pNew-
1e840 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1e850 65 71 29 29 21 3d 30 20 7c 7c 20 62 49 6e 29 20  eq))!=0 || bIn) 
1e860 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a  ){.    int seenZ
1e870 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
1e880 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e890 61 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70  a plan with no p
1e8a0 72 65 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20  rereqs seen */. 
1e8b0 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e     int seenZeroN
1e8c0 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oIN = 0;        
1e8d0 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f   /* Plan with no
1e8e0 20 70 72 65 72 65 71 73 20 61 6e 64 20 6e 6f 20   prereqs and no 
1e8f0 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a  IN(...) seen */.
1e900 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65      Bitmask mPre
1e910 76 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61  v = 0;.    Bitma
1e920 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30  sk mBestNoIn = 0
1e930 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1e940 20 70 6c 61 6e 20 70 72 6f 64 75 63 65 64 20 62   plan produced b
1e950 79 20 74 68 65 20 65 61 72 6c 69 65 72 20 63 61  y the earlier ca
1e960 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  ll uses an IN(..
1e970 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20  .) term, call.  
1e980 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20    ** xBestIndex 
1e990 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65  again, this time
1e9a0 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65   with IN(...) te
1e9b0 72 6d 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f  rms disabled. */
1e9c0 0a 20 20 20 20 69 66 28 20 62 49 6e 20 29 7b 0a  .    if( bIn ){.
1e9d0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1e9e0 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1e9f0 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c  alOne: all usabl
1ea00 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  e w/o IN\n"));. 
1ea10 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1ea20 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1ea30 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1ea40 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41  lder, mPrereq, A
1ea50 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70  LLBITS, WO_IN, p
1ea60 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1ea70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ea80 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  bIn==0 );.      
1ea90 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77  mBestNoIn = pNew
1eaa0 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1eab0 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  req;.      if( m
1eac0 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20  BestNoIn==0 ){. 
1ead0 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20         seenZero 
1eae0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 65  = 1;.        see
1eaf0 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20  nZeroNoIN = 1;. 
1eb00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1eb10 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74 49    /* Call xBestI
1eb20 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20 65 61  ndex once for ea
1eb30 63 68 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  ch distinct valu
1eb40 65 20 6f 66 20 28 70 72 65 72 65 71 52 69 67 68  e of (prereqRigh
1eb50 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20 0a 20  t & ~mPrereq) . 
1eb60 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 65 74     ** in the set
1eb70 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74 20 61   of terms that a
1eb80 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75 72 72  pply to the curr
1eb90 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ent virtual tabl
1eba0 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  e.  */.    while
1ebb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ebc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1ebd0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e        Bitmask mN
1ebe0 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20  ext = ALLBITS;. 
1ebf0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 4e 65       assert( mNe
1ec00 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  xt>0 );.      fo
1ec10 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1ec20 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
1ec30 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 68 69      Bitmask mThi
1ec40 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20  s = (.          
1ec50 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e    pWC->a[p->aCon
1ec60 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
1ec70 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69  Offset].prereqRi
1ec80 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 0a 20  ght & ~mPrereq. 
1ec90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1eca0 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50 72 65    if( mThis>mPre
1ecb0 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74  v && mThis<mNext
1ecc0 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73   ) mNext = mThis
1ecd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ece0 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20  mPrev = mNext;. 
1ecf0 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d       if( mNext==
1ed00 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61 6b 3b  ALLBITS ) break;
1ed10 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74  .      if( mNext
1ed20 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74  ==mBest || mNext
1ed30 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f  ==mBestNoIn ) co
1ed40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48  ntinue;.      WH
1ed50 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1ed60 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d  "  VirtualOne: m
1ed70 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78  Prev=%04llx mNex
1ed80 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20  t=%04llx\n",.   
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e      (sqlite3_uin
1edb0 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71 6c 69  t64)mPrev, (sqli
1edc0 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74  te3_uint64)mNext
1edd0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1ede0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1edf0 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1ee00 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1ee10 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65  eq, mNext|mPrere
1ee20 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  q, 0, p, mNoOmit
1ee30 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69  , &bIn);.      i
1ee40 66 28 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d  f( pNew->prereq=
1ee50 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20 20 20 20  =mPrereq ){.    
1ee60 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31      seenZero = 1
1ee70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 49  ;.        if( bI
1ee80 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1ee90 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  oIN = 1;.      }
1eea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1eeb0 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78  f the calls to x
1eec0 42 65 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74  BestIndex() in t
1eed0 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69  he above loop di
1eee0 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61  d not find a pla
1eef0 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  n.    ** that re
1ef00 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65  quires no source
1ef10 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28   tables at all (
1ef20 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74  i.e. one guarant
1ef30 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eed to be.    **
1ef40 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61   usable), make a
1ef50 20 63 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20   call here with 
1ef60 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65  all source table
1ef70 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
1ef80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ef90 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d  _OK && seenZero=
1efa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  =0 ){.      WHER
1efb0 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1efc0 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1efd0 20 64 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a   disabled\n"));.
1efe0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1eff0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1f000 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1f010 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1f020 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d  mPrereq, 0, p, m
1f030 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20  NoOmit, &bIn);. 
1f040 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20       if( bIn==0 
1f050 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  ) seenZeroNoIN =
1f060 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
1f070 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74  * If the calls t
1f080 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 68  o xBestIndex() h
1f090 61 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c 65  ave so far faile
1f0a0 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e  d to find a plan
1f0b0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71  .    ** that req
1f0c0 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20  uires no source 
1f0d0 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e  tables at all an
1f0e0 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  d does not use a
1f0f0 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a  n IN(...).    **
1f100 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20   operator, make 
1f110 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20  a final call to 
1f120 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e  obtain one here.
1f130 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1f140 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65  =SQLITE_OK && se
1f150 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b  enZeroNoIN==0 ){
1f160 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1f170 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1f180 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61  ualOne: all disa
1f190 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c  bled and w/o IN\
1f1a0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n"));.      rc =
1f1b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1f1c0 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20  tualOne(.       
1f1d0 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72     pBuilder, mPr
1f1e0 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57  ereq, mPrereq, W
1f1f0 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  O_IN, p, mNoOmit
1f200 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  , &bIn);.    }. 
1f210 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65   }..  if( p->nee
1f220 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
1f230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1f240 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
1f250 65 33 44 62 46 72 65 65 4e 4e 28 70 50 61 72 73  e3DbFreeNN(pPars
1f260 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 57 48 45  e->db, p);.  WHE
1f270 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28  RETRACE(0x800, (
1f280 22 45 4e 44 20 25 73 2e 61 64 64 56 69 72 74 75  "END %s.addVirtu
1f290 61 6c 28 29 2c 20 72 63 3d 25 64 5c 6e 22 2c 20  al(), rc=%d\n", 
1f2a0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1f2b0 65 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72  e, rc));.  retur
1f2c0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1f2d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1f2e0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1f2f0 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1f300 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1f310 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1f320 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1f330 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1f340 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1f350 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1f360 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1f370 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1f380 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1f390 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1f3a0 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55  q, .  Bitmask mU
1f3b0 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65  nusable.){.  Whe
1f3c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
1f3d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1f3e0 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
1f3f0 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
1f400 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
1f410 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
1f420 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
1f430 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1f440 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
1f450 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
1f460 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1f470 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
1f480 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
1f490 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53  sCur;.  struct S
1f4a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1f4b0 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70  em;.  .  pWC = p
1f4c0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1f4d0 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
1f4e0 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
1f4f0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1f500 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
1f510 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
1f520 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
1f530 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1f540 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
1f550 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
1f560 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
1f570 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1f580 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
1f590 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f5a0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
1f5b0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1f5c0 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
1f5d0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
1f5e0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
1f5f0 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
1f600 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
1f610 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
1f620 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
1f630 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
1f640 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1f650 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
1f660 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
1f670 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
1f680 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
1f690 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
1f6a0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
1f6b0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
1f6c0 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
1f6d0 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
1f6e0 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
1f6f0 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
1f700 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
1f710 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
1f720 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48  &sCur;..      WH
1f730 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1f740 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("Begin processi
1f750 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c  ng OR-clause %p\
1f760 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20  n", pTerm));.   
1f770 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
1f780 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
1f790 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
1f7a0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1f7b0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
1f7c0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
1f7d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1f7e0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1f7f0 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
1f800 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
1f810 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
1f820 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
1f830 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
1f840 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
1f850 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
1f860 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1f870 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
1f880 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1f890 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1f8a0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
1f8b0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1f8c0 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
1f8d0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
1f8e0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
1f8f0 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
1f900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f910 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f930 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64  sCur.n = 0;.#ifd
1f940 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
1f950 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48  ABLED.        WH
1f960 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1f970 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20  ("OR-term %d of 
1f980 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72  %p has %d subter
1f990 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  ms:\n", .       
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
1f9b0 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d  )(pOrTerm-pOrWC-
1f9c0 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62  >a), pTerm, sSub
1f9d0 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d  Build.pWC->nTerm
1f9e0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1f9f0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
1fa00 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
1fa10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1fa20 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73  ereClausePrint(s
1fa30 53 75 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20  SubBuild.pWC);. 
1fa40 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
1fa50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fa60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1fa70 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
1fa80 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
1fa90 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
1faa0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1fab0 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
1fac0 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d  uild, mPrereq, m
1fad0 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20  Unusable);.     
1fae0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1faf0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1fb00 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1fb10 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
1fb20 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b  Build, mPrereq);
1fb30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fb40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fb50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fb60 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1fb70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1fb80 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1fb90 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  able);.        }
1fba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fbb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1fbc0 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
1fbd0 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
1fbe0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1fbf0 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1fc00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fc10 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1fc20 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
1fc30 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1fc40 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
1fc50 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
1fc60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1fc70 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1fc80 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20  OrSet sPrev;.   
1fc90 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1fca0 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
1fcb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
1fcc0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1fcd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
1fce0 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
1fcf0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1fd00 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
1fd10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1fd20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
1fd30 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
1fd40 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
1fd50 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1fd80 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
1fd90 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
1fda0 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1fdd0 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1fde0 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
1fdf0 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
1fe00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fe10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1fe20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
1fe30 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
1fe40 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1fe50 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
1fe60 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1fe70 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
1fe80 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
1fe90 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
1fea0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1feb0 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
1fec0 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
1fed0 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
1fee0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1fef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ff00 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
1ff10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
1ff20 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53  NG: Currently sS
1ff30 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20  um.a[i].rRun is 
1ff40 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  set to the sum o
1ff50 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20  f the costs.    
1ff60 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75      ** of all su
1ff70 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64  b-scans required
1ff80 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e   by the OR-scan.
1ff90 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   However, due to
1ffa0 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20   rounding.      
1ffb0 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20    ** errors, it 
1ffc0 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20  may be that the 
1ffd0 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73  cost of the OR-s
1ffe0 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20  can is equal to 
1fff0 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  its.        ** m
20000 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75  ost expensive su
20010 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20  b-scan. Add the 
20020 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
20030 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20  e penalty .     
20040 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e     ** (equivalen
20050 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67  t to multiplying
20060 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30   the cost by 1.0
20070 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  7) to ensure tha
20080 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t .        ** th
20090 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  is does not happ
200a0 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  en. Otherwise, f
200b0 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
200c0 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20   such as the.   
200d0 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
200e0 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73  g where there is
200f0 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22   an index on "y"
20100 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
20110 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52       **     WHER
20120 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f  E likelihood(x=?
20130 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20  , 0.99) OR y=?. 
20140 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20150 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72    ** the planner
20160 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f   may elect to "O
20170 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75  R" together a fu
20180 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e  ll-table scan an
20190 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  d an.        ** 
201a0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e  index lookup. An
201b0 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c  d other similarl
201c0 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20  y odd results.  
201d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
201e0 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
201f0 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20  ].rRun + 1;.    
20200 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
20210 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
20220 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
20230 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
20240 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
20250 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
20260 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
20270 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
20280 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
20290 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72  (0x200, ("End pr
202a0 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
202b0 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
202c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
202d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
202e0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
202f0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
20300 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
20310 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
20320 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
20330 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
20340 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
20350 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
20360 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
20370 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
20380 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  q = 0;.  Bitmask
20390 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
203a0 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
203b0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
203c0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
203d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
203e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
203f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20400 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54  item *pEnd = &pT
20410 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f  abList->a[pWInfo
20420 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c  ->nLevel];.  sql
20430 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
20440 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
20450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20460 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  _OK;.  WhereLoop
20470 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69   *pNew;.  u8 pri
20480 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  orJointype = 0;.
20490 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
204a0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
204b0 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
204c0 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
204d0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
204e0 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
204f0 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
20500 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c  pBuilder->iPlanL
20510 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 51 55  imit = SQLITE_QU
20520 45 52 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d 49  ERY_PLANNER_LIMI
20530 54 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  T;.  for(iTab=0,
20540 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
20550 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20  >a; pItem<pEnd; 
20560 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
20570 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55  {.    Bitmask mU
20580 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  nusable = 0;.   
20590 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
205a0 61 62 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  ab;.    pBuilder
205b0 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 20 2b 3d 20  ->iPlanLimit += 
205c0 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41  SQLITE_QUERY_PLA
205d0 4e 4e 45 52 5f 4c 49 4d 49 54 5f 49 4e 43 52 3b  NNER_LIMIT_INCR;
205e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
205f0 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65  elf = sqlite3Whe
20600 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
20610 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
20620 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
20630 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66    if( ((pItem->f
20640 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72  g.jointype|prior
20650 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f  Jointype) & (JT_
20660 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
20670 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
20680 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
20690 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d   true when pItem
206a0 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   is the FROM cla
206b0 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a  use term on the.
206c0 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68        ** right-h
206d0 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45  and-side of a LE
206e0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
206f0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65  .  */.      mPre
20700 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  req = mPrior;.  
20710 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
20720 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66  ntype = pItem->f
20730 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e  g.jointype;.#ifn
20740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20750 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
20760 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
20770 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
20780 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
20790 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20  ist_item *p;.   
207a0 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b     for(p=&pItem[
207b0 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  1]; p<pEnd; p++)
207c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 55  {.        if( mU
207d0 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66  nusable || (p->f
207e0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  g.jointype & (JT
207f0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
20800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55   ){.          mU
20810 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74  nusable |= sqlit
20820 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
20830 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
20840 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  , p->iCursor);. 
20850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20860 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
20870 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
20880 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
20890 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
208a0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
208b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
208c0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20  IRTUALTABLE */. 
208d0 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20     {.      rc = 
208e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
208f0 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  e(pBuilder, mPre
20900 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  req);.    }.    
20910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20920 4b 20 26 26 20 70 42 75 69 6c 64 65 72 2d 3e 70  K && pBuilder->p
20930 57 43 2d 3e 68 61 73 4f 72 20 29 7b 0a 20 20 20  WC->hasOr ){.   
20940 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
20950 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
20960 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
20970 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ble);.    }.    
20980 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e  mPrior |= pNew->
20990 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66  maskSelf;.    if
209a0 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ( rc || db->mall
209b0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
209c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
209d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
209e0 20 2f 2a 20 57 65 20 68 69 74 20 74 68 65 20 71   /* We hit the q
209f0 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 73 65 61  uery planner sea
20a00 72 63 68 20 6c 69 6d 69 74 20 73 65 74 20 62 79  rch limit set by
20a10 20 69 50 6c 61 6e 4c 69 6d 69 74 20 2a 2f 0a 20   iPlanLimit */. 
20a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
20a30 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
20a40 47 2c 20 22 61 62 62 72 65 76 69 61 74 65 64 20  G, "abbreviated 
20a50 71 75 65 72 79 20 61 6c 67 6f 72 69 74 68 6d 20  query algorithm 
20a60 73 65 61 72 63 68 22 29 3b 0a 20 20 20 20 20 20  search");.      
20a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20a80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20a90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20aa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20ab0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
20ac0 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
20ad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20ae0 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
20af0 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
20b00 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
20b10 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
20b20 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70   of the 6th.** p
20b30 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
20b40 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
20b50 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
20b60 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
20b70 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
20b80 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
20b90 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
20ba0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
20bb0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
20bc0 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
20bd0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20be0 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
20bf0 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
20c00 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
20c10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20c20 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
20c30 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
20c40 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
20c50 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
20c60 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
20c70 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
20c80 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
20c90 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
20ca0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
20cb0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
20cc0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
20cd0 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
20ce0 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
20cf0 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
20d00 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
20d10 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
20d20 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
20d30 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
20d40 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
20d50 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
20d60 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
20d70 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
20d80 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
20d90 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
20da0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
20db0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
20dc0 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
20dd0 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
20de0 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
20df0 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
20e00 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
20e10 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
20e20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
20e30 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
20e40 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
20e50 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
20e60 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
20e70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
20e80 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
20e90 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
20ea0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
20eb0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
20ec0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
20ed0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
20ee0 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
20ef0 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
20f00 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
20f10 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
20f20 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
20f30 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
20f40 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
20f50 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
20f60 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ,       /* WHERE
20f70 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53  _GROUPBY or _DIS
20f80 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45  TINCTBY or _ORDE
20f90 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75  RBY_LIMIT */.  u
20fa0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
20fb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20fc0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
20fd0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
20fe0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
20ff0 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
21000 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
21010 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
21020 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
21030 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
21040 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
21050 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
21060 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
21070 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
21080 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
21090 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
210a0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
210b0 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
210c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
210d0 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
210e0 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
210f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21100 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
21110 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
21120 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
21130 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
21140 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
21150 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
21160 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
21170 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
21180 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
21190 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
211a0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
211b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
211c0 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
211d0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
211e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
211f0 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20    u16 eqOpMask; 
21200 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
21210 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  ed equality oper
21220 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e  ators */.  u16 n
21230 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
21240 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
21250 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
21260 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
21270 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
21280 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
21290 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
212a0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
212b0 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
212c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
212d0 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
212e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
212f0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
21300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21310 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
21320 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
21330 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
21340 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
21350 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21360 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
21370 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
21380 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
21390 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
213a0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
213b0 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
213c0 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
213d0 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
213e0 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
213f0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
21400 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
21410 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
21420 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
21430 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
21440 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
21450 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
21460 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
21470 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
21480 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
21490 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
214a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
214b0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
214c0 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
214d0 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
214e0 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
214f0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
21500 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
21510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
21520 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
21530 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
21540 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
21550 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
21560 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
21570 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
21580 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
21590 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
215a0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
215b0 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
215c0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
215d0 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
215e0 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
215f0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
21600 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
21610 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
21620 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
21630 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
21640 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
21650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21660 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
21670 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
21680 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
21690 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
216a0 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
216b0 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
216c0 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
216d0 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
216e0 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
216f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
21700 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
21710 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
21720 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
21730 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
21740 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
21750 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
21760 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
21770 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
21780 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
21790 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
217a0 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
217b0 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
217c0 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
217d0 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
217e0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
217f0 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
21800 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
21810 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
21820 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
21830 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
21840 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
21850 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
21860 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
21870 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21880 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
21890 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
218a0 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
218b0 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
218c0 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
218d0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
218e0 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
218f0 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
21900 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
21910 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
21920 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
21930 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
21940 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
21950 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
21960 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
21970 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
21980 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
21990 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
219a0 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
219b0 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
219c0 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
219d0 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
219e0 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
219f0 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
21a00 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
21a10 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
21a20 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
21a30 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
21a40 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
21a50 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
21a60 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
21a70 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
21a80 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
21a90 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
21aa0 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
21ab0 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
21ac0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
21ad0 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
21ae0 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
21af0 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
21b00 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
21b10 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
21b20 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
21b30 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
21b40 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
21b50 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
21b60 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
21b70 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
21b80 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
21b90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
21ba0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
21bb0 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
21bc0 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
21bd0 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
21be0 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
21bf0 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
21c00 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
21c10 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
21c20 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
21c30 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
21c40 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
21c50 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
21c60 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70  eady = 0;.  eqOp
21c70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57  Mask = WO_EQ | W
21c80 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c  O_IS | WO_ISNULL
21c90 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ;.  if( wctrlFla
21ca0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
21cb0 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d  BY_LIMIT ) eqOpM
21cc0 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20  ask |= WO_IN;.  
21cd0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
21ce0 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
21cf0 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
21d00 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
21d10 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
21d20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
21d30 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
21d40 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  lf;.    if( iLoo
21d50 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  p<nLoop ){.     
21d60 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e   pLoop = pPath->
21d70 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
21d80 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
21d90 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
21da0 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69  BY_LIMIT ) conti
21db0 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nue;.    }else{.
21dc0 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c        pLoop = pL
21dd0 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ast;.    }.    i
21de0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
21df0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
21e00 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
21e10 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
21e20 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
21e30 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
21e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21e50 65 6c 73 65 20 69 66 28 20 77 63 74 72 6c 46 6c  else if( wctrlFl
21e60 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
21e70 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
21e80 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
21e90 44 69 73 74 69 6e 63 74 43 6f 6c 20 3d 20 30 3b  DistinctCol = 0;
21ea0 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
21eb0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
21ec0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
21ed0 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
21ee0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
21ef0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
21f00 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
21f10 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
21f20 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
21f30 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
21f40 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
21f50 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
21f60 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
21f70 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
21f80 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
21f90 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
21fa0 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
21fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
21fc0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
21fd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21fe0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21ff0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
22000 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
22010 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
22020 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79  CollateAndLikely
22030 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
22040 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
22050 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
22060 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
22070 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
22080 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
22090 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
220a0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73  .      pTerm = s
220b0 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
220c0 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
220d0 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
220e0 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73   ~ready, eqOpMas
22110 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
22120 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
22130 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
22140 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
22150 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  ==WO_IN ){.     
22160 20 20 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61     /* IN terms a
22170 72 65 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  re only valid fo
22180 72 20 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65  r sorting in the
22190 20 4f 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20   ORDER BY LIMIT 
221a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  .        ** opti
221b0 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68  mization, and th
221c0 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20  en only if they 
221d0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
221e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  d.        ** by 
221f0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  the query plan *
22200 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
22210 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
22220 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
22230 49 54 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  IT );.        fo
22240 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e  r(j=0; j<pLoop->
22250 6e 4c 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21  nLTerm && pTerm!
22260 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a  =pLoop->aLTerm[j
22270 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ]; j++){}.      
22280 20 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e    if( j>=pLoop->
22290 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75  nLTerm ) continu
222a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
222b0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
222c0 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f  erator&(WO_EQ|WO
222d0 5f 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45  _IS))!=0 && pOBE
222e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
222f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
22300 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
22310 71 4d 61 74 63 68 28 70 57 49 6e 66 6f 2d 3e 70  qMatch(pWInfo->p
22320 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
22330 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
22340 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  By->a[i].pExpr, 
22350 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3d 3d 30  pTerm->pExpr)==0
22360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
22370 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22380 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
22390 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
223a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
223b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53       }.      obS
223c0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
223d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
223e0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
223f0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
22400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
22410 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
22420 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20  & WHERE_IPK ){. 
22430 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
22440 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  0;.        nKeyC
22450 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
22460 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
22470 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49     }else if( (pI
22480 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
22490 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30  btree.pIndex)==0
224a0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f   || pIndex->bUno
224b0 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20  rdered ){.      
224c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
224d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
224e0 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65   nKeyCol = pInde
224f0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
22500 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
22510 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
22520 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
22530 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b  Column==nKeyCol+
22540 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  1 || !HasRowid(p
22550 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29  Index->pTable) )
22560 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
22570 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
22580 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58  mn[nColumn-1]==X
22590 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20  N_ROWID.        
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70    || !HasRowid(p
225c0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
225d0 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
225e0 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69  Distinct = IsUni
225f0 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
22600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22610 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
22620 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
22630 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 3d  WHERE_SKIPSCAN)=
22640 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  =0;.      }..   
22650 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
22660 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
22670 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
22680 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
22690 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
226a0 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
226b0 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
226c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
226d0 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
226e0 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
226f0 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
22700 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
22710 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
22720 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 20 3d        u8 bOnce =
22730 20 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20 72   1; /* True to r
22740 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
22750 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
22760 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22770 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
22780 65 2e 6e 45 71 20 0a 20 20 20 20 20 20 20 20 20  e.nEq .         
22790 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c     || (pLoop->aL
227a0 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c  Term[j]==0)==(j<
227b0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20  pLoop->nSkip).  
227c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
227d0 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
227e0 62 74 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d  btree.nEq && j>=
227f0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a  pLoop->nSkip ){.
22800 20 20 20 20 20 20 20 20 20 20 75 31 36 20 65 4f            u16 eO
22810 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  p = pLoop->aLTer
22820 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  m[j]->eOperator;
22830 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ..          /* S
22840 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
22850 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65  IS and ISNULL te
22860 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70  rms.  (Also skip
22870 20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a 20   IN terms when. 
22880 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e           ** doin
22890 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  g WHERE_ORDERBY_
228a0 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e 67  LIMIT processing
228b0 29 2e 20 20 45 78 63 65 70 74 2c 20 49 53 20 61  ).  Except, IS a
228c0 6e 64 20 49 53 4e 55 4c 4c 0a 20 20 20 20 20 20  nd ISNULL.      
228d0 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 69 6d 70      ** terms imp
228e0 6c 79 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ly that the inde
228f0 78 20 69 73 20 6e 6f 74 20 55 4e 49 51 55 45 20  x is not UNIQUE 
22900 4e 4f 54 20 4e 55 4c 4c 20 69 6e 20 77 68 69 63  NOT NULL in whic
22910 68 20 63 61 73 65 0a 20 20 20 20 20 20 20 20 20  h case.         
22920 20 2a 2a 20 74 68 65 20 6c 6f 6f 70 20 6e 65 65   ** the loop nee
22930 64 20 74 6f 20 62 65 20 6d 61 72 6b 65 64 20 61  d to be marked a
22940 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
22950 69 6e 63 74 20 62 65 63 61 75 73 65 20 69 74 20  inct because it 
22960 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
22970 20 68 61 76 65 20 72 65 70 65 61 74 65 64 20 4e   have repeated N
22980 55 4c 4c 20 72 6f 77 73 2e 0a 20 20 20 20 20 20  ULL rows..      
22990 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
229a0 20 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   ** If the curre
229b0 6e 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c  nt term is a col
229c0 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29  umn of an ((?,?)
229d0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29   IN (SELECT...))
229e0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65   .          ** e
229f0 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68  xpression for wh
22a00 69 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72  ich the SELECT r
22a10 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
22a20 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20   one column,.   
22a30 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20         ** check 
22a40 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f  that it is the o
22a50 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20  nly column used 
22a60 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74  by this loop. Ot
22a70 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20  herwise,.       
22a80 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f     ** if it is o
22a90 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ne of two or mor
22aa0 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63  e, none of the c
22ab0 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20  olumns can be.  
22ac0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69          ** consi
22ad0 64 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61  dered to match a
22ae0 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e  n ORDER BY term.
22af0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
22b00 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
22b10 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20   & eqOpMask)!=0 
22b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
22b30 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  f( eOp & (WO_ISN
22b40 55 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20  ULL|WO_IS) ){.  
22b50 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22b60 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
22b70 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
22b80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22b90 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
22bb0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
22bc0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
22bd0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
22be0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
22bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22c00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
22c10 3b 20 20 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ;  .          }e
22c20 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 65  lse if( ALWAYS(e
22c30 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20  Op & WO_IN) ){. 
22c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c             /* AL
22c50 57 41 59 53 28 29 20 6a 75 73 74 69 66 69 63 61  WAYS() justifica
22c60 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20  tion: eOp is an 
22c70 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
22c80 72 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 20  r due to the.   
22c90 20 20 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c           ** j<pL
22ca0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
22cb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f 76   constraint abov
22cc0 65 2e 20 20 41 6e 79 20 65 71 75 61 6c 69 74 79  e.  Any equality
22cd0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20   other.         
22ce0 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e     ** than WO_IN
22cf0 20 69 73 20 63 61 70 74 75 72 65 64 20 62 79 20   is captured by 
22d00 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 69 66  the previous "if
22d10 22 2e 20 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a  ".  So this one.
22d20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
22d30 6c 77 61 79 73 20 68 61 73 20 74 6f 20 62 65 20  lways has to be 
22d40 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20  WO_IN. */.      
22d50 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
22d60 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
22d70 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  ]->pExpr;.      
22d80 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b        for(i=j+1;
22d90 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   i<pLoop->u.btre
22da0 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  e.nEq; i++){.   
22db0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22dc0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  Loop->aLTerm[i]-
22dd0 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20  >pExpr==pX ){.  
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
22df0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c  sert( (pLoop->aL
22e00 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74  Term[i]->eOperat
22e10 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20  or & WO_IN) );. 
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
22e30 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
22e40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
22e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22e70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22e80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
22e90 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
22ea0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
22eb0 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
22ec0 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
22ed0 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
22ee0 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
22ef0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
22f00 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
22f10 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
22f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43   ){.          iC
22f30 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
22f40 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
22f50 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
22f60 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
22f70 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
22f80 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
22f90 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
22fa0 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
22fb0 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
22fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22fd0 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f     iColumn = XN_
22fe0 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20  ROWID;.         
22ff0 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
23000 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
23010 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
23020 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
23030 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
23040 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
23050 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
23060 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
23070 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
23080 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
23090 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
230a0 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
230b0 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
230c0 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
230d0 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
230e0 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
230f0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
23100 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
23110 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23120 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
23130 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
23140 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
23150 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
23160 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
23170 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
23180 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
23190 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
231a0 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
231b0 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
231c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
231d0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
231e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
231f0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
23200 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
23210 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
23220 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
23230 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23240 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
23250 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
23260 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 4f 72  ateAndLikely(pOr
23270 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
23280 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
23290 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
232a0 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
232b0 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
232c0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
232d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
232e0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
232f0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
23300 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
23310 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
23320 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
23330 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
23340 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
23350 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  XN_ROWID ){.    
23360 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
23370 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
23380 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
23390 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
233a0 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
233b0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
233c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
233d0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
233e0 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
233f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
23400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23410 20 20 20 20 45 78 70 72 20 2a 70 49 64 78 45 78      Expr *pIdxEx
23420 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
23430 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70  lExpr->a[j].pExp
23440 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
23450 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
23460 6d 70 61 72 65 53 6b 69 70 28 70 4f 42 45 78 70  mpareSkip(pOBExp
23470 72 2c 20 70 49 64 78 45 78 70 72 2c 20 69 43 75  r, pIdxExpr, iCu
23480 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
23490 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
234a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
234b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
234c0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 21 3d 58    if( iColumn!=X
234d0 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
234e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
234f0 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
23500 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
23510 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
23520 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
23530 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23540 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
23550 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
23560 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
23570 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23590 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
235a0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
235b0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
235c0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
235d0 6e 44 69 73 74 69 6e 63 74 43 6f 6c 20 3d 20 6a  nDistinctCol = j
235e0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  +1;.          }.
235f0 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
23600 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
23610 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23620 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
23630 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
23640 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
23650 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
23660 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
23670 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
23680 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
23690 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
236a0 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
236b0 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
236c0 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
236d0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
236e0 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
236f0 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
23700 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23710 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
23720 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
23730 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63  rtOrder ) isMatc
23740 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
23750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23760 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
23770 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
23780 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
23790 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
237a0 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
237b0 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
237c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
237d0 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
237e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
237f0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
23800 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
23810 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  f( iColumn==XN_R
23820 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
23830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
23840 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
23850 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
23860 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
23870 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
23880 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
23890 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
238a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
238b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
238c0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 20 26  E_ORDERBY_MIN) &
238d0 26 20 6a 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j==pLoop->u.bt
238e0 72 65 65 2e 6e 45 71 20 29 7b 0a 20 20 20 20 20  ree.nEq ){.     
238f0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
23900 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4d  Flags |= WHERE_M
23910 49 4e 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  IN_ORDERED;.    
23920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23940 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
23950 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
23960 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
23970 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
23980 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
23990 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
239a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
239b0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
239c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
239d0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
239e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
239f0 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
23a00 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
23a10 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
23a20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
23a30 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
23a40 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
23a50 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
23a60 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
23a70 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
23a80 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
23a90 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
23aa0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
23ab0 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
23ac0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
23ad0 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
23ae0 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
23af0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
23b00 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
23b10 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
23b20 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
23b30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
23b40 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
23b50 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
23b60 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
23b70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
23b80 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
23b90 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
23ba0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
23bb0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
23bc0 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
23bd0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
23be0 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
23bf0 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
23c00 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
23c10 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
23c20 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
23c30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23c40 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
23c50 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
23c60 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
23c70 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
23c80 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
23c90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
23ca0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
23cb0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
23cc0 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
23cd0 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
23ce0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
23cf0 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
23d00 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
23d10 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
23d20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
23d30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
23d40 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
23d50 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
23d60 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
23d70 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
23d80 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
23d90 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
23da0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23db0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
23dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
23dd0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
23de0 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
23df0 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
23e00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23e10 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
23e20 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
23e30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
23e40 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
23e50 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
23e60 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
23e70 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
23e80 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
23e90 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
23ea0 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
23eb0 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
23ec0 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
23ed0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
23ee0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
23ef0 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
23f00 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
23f10 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
23f20 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
23f30 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
23f40 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
23f50 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
23f60 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
23f70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
23f80 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
23f90 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
23fa0 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
23fb0 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
23fc0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
23fd0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
23fe0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
23ff0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
24000 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
24010 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
24020 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
24030 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
24040 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
24050 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
24060 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
24070 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
24080 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
24090 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
240a0 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
240b0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
240c0 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
240d0 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
240e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
240f0 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
24100 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
24110 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
24120 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
24130 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
24140 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
24150 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
24160 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
24170 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
24180 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
24190 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
241a0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
241b0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
241c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
241d0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
241e0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
241f0 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
24200 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
24210 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
24220 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
24230 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
24240 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
24250 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
24260 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
24270 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
24280 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
24290 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
242a0 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
242b0 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
242c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
242d0 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
242e0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
242f0 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
24300 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
24310 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
24320 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
24330 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
24340 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24350 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
24360 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
24370 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
24380 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
24390 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
243a0 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
243b0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
243c0 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
243d0 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
243e0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
243f0 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
24400 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
24410 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
24420 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
24430 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
24440 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
24450 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
24460 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
24470 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
24480 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
24490 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
244a0 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
244b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
244c0 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
244d0 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
244e0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
244f0 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
24500 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
24510 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
24520 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
24530 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
24540 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
24550 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
24560 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
24570 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
24580 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
24590 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
245a0 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
245b0 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
245c0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
245d0 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
245e0 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
245f0 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
24600 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
24610 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
24620 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
24630 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
24640 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
24650 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
24660 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
24670 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
24680 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
24690 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
246a0 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
246b0 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
246c0 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
246d0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
246e0 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
246f0 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
24700 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
24710 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
24720 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
24730 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
24740 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
24750 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
24760 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
24770 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
24780 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
24790 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
247a0 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
247b0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
247c0 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
247d0 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
247e0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
247f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
24800 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
24810 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
24820 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
24830 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
24840 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
24850 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
24860 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
24870 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
24880 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
24890 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
248a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
248b0 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
248c0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
248d0 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
248e0 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
248f0 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
24900 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
24910 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
24920 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
24930 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
24940 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
24950 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
24960 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
24970 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
24980 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
24990 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
249a0 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
249b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
249c0 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
249d0 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
249e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
249f0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
24a00 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
24a10 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
24a20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
24a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24a40 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
24a50 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
24a60 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
24a70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24a80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24a90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
24aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24ab0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
24ac0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
24ad0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
24ae0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
24af0 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
24b00 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
24b10 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
24b40 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
24b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24b60 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
24b70 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
24b80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
24b90 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
24ba0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
24bb0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
24bc0 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
24bd0 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
24be0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
24bf0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
24c00 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
24c10 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
24c20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
24c30 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
24c40 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
24c50 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
24c60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
24c70 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
24c80 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
24c90 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
24ca0 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
24cb0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
24cc0 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
24cd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
24ce0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
24cf0 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
24d00 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
24d10 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
24d20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
24d30 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
24d40 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
24d50 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
24d60 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
24d70 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
24d80 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
24d90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
24da0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
24db0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
24dc0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
24dd0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
24de0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
24df0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
24e00 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
24e10 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
24e20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24e30 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
24e40 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
24e50 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
24e60 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
24e70 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
24e80 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
24e90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
24ea0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
24eb0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
24ec0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
24ed0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
24ee0 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
24ef0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
24f00 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
24f10 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
24f20 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
24f30 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
24f40 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24f50 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
24f60 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
24f70 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
24f80 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
24f90 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
24fa0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
24fb0 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
24fc0 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
24fd0 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
24fe0 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
24ff0 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
25000 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
25010 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
25020 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
25030 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
25040 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
25050 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
25060 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
25070 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
25080 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
25090 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
250a0 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
250b0 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
250c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
250d0 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
250e0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
250f0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
25100 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
25110 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
25120 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
25130 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
25140 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
25150 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
25160 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
25170 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
25180 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
25190 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
251a0 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
251b0 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
251c0 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
251d0 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
251e0 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
251f0 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
25200 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
25210 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
25220 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
25230 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
25240 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
25250 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
25260 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
25270 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
25280 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
25290 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
252a0 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
252b0 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
252c0 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
252d0 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
252e0 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
252f0 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
25300 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
25310 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
25320 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
25330 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
25340 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
25350 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
25360 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
25370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25380 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
25390 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
253a0 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
253b0 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
253c0 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
253d0 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
253e0 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
253f0 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
25400 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
25410 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
25420 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
25430 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
25440 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
25450 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
25460 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
25470 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
25480 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
25490 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
254a0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
254b0 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
254c0 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
254d0 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
254e0 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
254f0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
25500 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
25510 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
25520 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
25530 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
25540 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
25550 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
25560 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
25570 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
25580 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
25590 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
255a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
255b0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
255c0 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
255d0 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
255e0 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
255f0 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
25600 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
25610 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
25620 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
25630 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
25640 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
25650 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
25660 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
25670 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
25680 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
25690 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
256a0 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
256b0 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
256c0 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
256d0 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
256e0 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
256f0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
25700 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
25710 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
25720 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
25730 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
25740 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
25750 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
25760 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
25770 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
25780 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
25790 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
257a0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
257b0 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
257c0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
257d0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
257e0 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
257f0 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
25800 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
25810 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
25820 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
25830 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
25840 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
25850 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
25860 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
25870 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
25880 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
25890 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
258a0 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
258b0 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
258c0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
258d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
258e0 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
258f0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
25900 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
25910 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
25920 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
25930 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
25940 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
25950 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
25960 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
25970 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
25980 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
25990 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
259a0 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
259b0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
259c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
259d0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
259e0 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
259f0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
25a00 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
25a10 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
25a20 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
25a30 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
25a40 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
25a50 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
25a60 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
25a70 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
25a80 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
25a90 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
25aa0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
25ab0 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
25ac0 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
25ad0 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
25ae0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
25af0 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
25b00 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
25b10 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
25b20 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
25b30 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
25b40 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
25b50 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
25b60 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
25b70 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
25b80 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
25b90 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
25ba0 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
25bb0 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
25bc0 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
25bd0 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25bf0 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
25c00 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
25c10 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
25c20 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
25c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25c40 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
25c50 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
25c60 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
25c70 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
25c80 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
25c90 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
25ca0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
25cb0 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
25cc0 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
25cd0 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
25ce0 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
25cf0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
25d00 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
25d10 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
25d20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
25d30 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
25d40 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
25d50 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
25d60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25d70 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
25d80 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
25d90 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
25da0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
25db0 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
25dc0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
25dd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25de0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
25df0 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
25e00 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
25e10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25e20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
25e30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
25e40 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
25e50 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 33 20 29 7b 0a  From->nRow<3 ){.
25e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
25e70 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d  not use an autom
25e80 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74 68  atic index if th
25e90 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65  e this loop is e
25ea0 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20  xpected.        
25eb0 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73    ** to run less
25ec0 20 74 68 61 6e 20 31 2e 32 35 20 74 69 6d 65 73   than 1.25 times
25ed0 2e 20 20 49 74 20 69 73 20 74 65 6d 70 74 69 6e  .  It is temptin
25ee0 67 20 74 6f 20 61 6c 73 6f 20 65 78 63 6c 75 64  g to also exclud
25ef0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  e.          ** a
25f00 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 75  utomatic index u
25f10 73 61 67 65 20 6f 6e 20 61 6e 20 6f 75 74 65 72  sage on an outer
25f20 20 6c 6f 6f 70 2c 20 62 75 74 20 73 6f 6d 65 74   loop, but somet
25f30 69 6d 65 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  imes an automati
25f40 63 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  c.          ** i
25f50 6e 64 65 78 20 69 73 20 75 73 65 66 75 6c 20 69  ndex is useful i
25f60 6e 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  n the outer loop
25f70 20 6f 66 20 61 20 63 6f 72 72 65 6c 61 74 65 64   of a correlated
25f80 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20   subquery. */.  
25f90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25fa0 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
25fb0 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
25fc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
25fd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
25fe0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
25ff0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
26000 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
26010 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
26020 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
26030 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
26040 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
26050 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
26060 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
26070 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
26080 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
26090 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
260a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
260b0 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
260c0 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
260d0 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
260e0 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
260f0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
26100 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
26110 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
26120 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
26130 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
26140 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
26150 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
26160 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
26170 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
26180 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
26190 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
261a0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
261b0 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
261c0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
261e0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
261f0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
26200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26210 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
26220 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
26230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26240 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
26250 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
26260 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
26270 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
26280 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
26290 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
262a0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
262b0 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
262c0 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
262d0 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
262e0 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
262f0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
26300 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
26310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26320 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 41 64 64 20  /* TUNING:  Add 
26330 61 20 73 6d 61 6c 6c 20 65 78 74 72 61 20 70 65  a small extra pe
26340 6e 61 6c 74 79 20 28 35 29 20 74 6f 20 73 6f 72  nalty (5) to sor
26350 74 69 6e 67 20 61 73 20 61 6e 0a 20 20 20 20 20  ting as an.     
26360 20 20 20 20 20 2a 2a 20 65 78 74 72 61 20 65 6e       ** extra en
26370 63 6f 75 72 61 67 6d 65 6e 74 20 74 6f 20 74 68  couragment to th
26380 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
26390 74 6f 20 73 65 6c 65 63 74 20 61 20 70 6c 61 6e  to select a plan
263a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
263b0 65 72 65 20 74 68 65 20 72 6f 77 73 20 65 6d 65  ere the rows eme
263c0 72 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65  rge in the corre
263d0 63 74 20 6f 72 64 65 72 20 77 69 74 68 6f 75 74  ct order without
263e0 20 61 6e 79 20 73 6f 72 74 69 6e 67 0a 20 20 20   any sorting.   
263f0 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72         ** requir
26400 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
26410 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
26420 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
26430 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69  ted, aSortCost[i
26440 73 4f 72 64 65 72 65 64 5d 29 20 2b 20 35 3b 0a  sOrdered]) + 5;.
26450 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
26460 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
26470 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
26480 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
26490 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
264a0 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
264b0 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
264c0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
264d0 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
264e0 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
264f0 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
26510 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
26520 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26530 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
26540 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
26550 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
26560 20 2d 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49 4e   -= 2;  /* TUNIN
26570 47 3a 20 20 53 6c 69 67 68 74 20 62 69 61 73 20  G:  Slight bias 
26580 69 6e 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d 73  in favor of no-s
26590 6f 72 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20 20  ort plans */.   
265a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
265b0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
265c0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
265d0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
265e0 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
265f0 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
26600 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
26610 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26620 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
26630 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
26640 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
26650 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
26660 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
26670 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
26680 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
26690 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
266a0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
266b0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
266c0 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
266d0 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
266e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
266f0 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
26700 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
26710 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
26720 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
26730 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
26740 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
26750 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
26760 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
26770 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
26780 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
26790 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
267a0 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
267b0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
267c0 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
267d0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
267e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
267f0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
26800 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
26810 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
26820 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
26830 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
26840 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
26850 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
26860 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
26870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26890 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
268a0 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
268b0 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
268c0 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
268d0 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
268e0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
268f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
26900 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
26910 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
26920 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
26930 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
26940 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
26950 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
26960 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26970 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
26980 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
26990 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
269a0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
269b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
269c0 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
269d0 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
269e0 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
269f0 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
26a00 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
26a10 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
26a20 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
26a30 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26a40 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
26a50 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
26a60 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
26a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26a80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26a90 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
26aa0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
26ab0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
26ae0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
26af0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
26b00 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20  t, rUnsorted,.  
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
26b30 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
26b40 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
26b50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
26b60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26b70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26b80 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
26b90 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
26ba0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
26bb0 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
26bc0 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
26bd0 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
26be0 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
26bf0 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
26c00 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
26c10 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
26c20 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
26c30 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
26c40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
26c50 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
26c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
26c70 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
26c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c90 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
26ca0 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
26cb0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
26cc0 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
26cd0 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
26ce0 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
26cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26d00 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
26d10 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
26d20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26d30 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
26d40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26d50 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
26d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
26d70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26d80 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
26d90 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
26da0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
26db0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
26dc0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
26dd0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
26de0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e  rCost, nOut, rUn
26df0 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  sorted,.        
26e00 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
26e10 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
26e20 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
26e30 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
26e40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26e50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
26e60 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
26e70 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   if best-so-far 
26e80 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d  path pTo=aTo[jj]
26e90 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20   covers the.    
26ea0 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65        ** same se
26eb0 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68  t of loops and h
26ec0 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72  as the same isOr
26ed0 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
26ee0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
26ef0 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
26f00 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
26f10 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
26f20 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
26f30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
26f40 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
26f50 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
26f60 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 20 20  kipped..        
26f70 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
26f80 2a 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ** The condition
26f90 61 6c 20 69 73 20 61 6e 20 65 78 70 61 6e 64 65  al is an expande
26fa0 64 20 76 65 63 74 6f 72 20 63 6f 6d 70 61 72 69  d vector compari
26fb0 73 6f 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 74  son equivalent t
26fc0 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o:.          ** 
26fd0 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70 54    (pTo->rCost,pT
26fe0 6f 2d 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e  o->nRow,pTo->rUn
26ff0 73 6f 72 74 65 64 29 20 3c 3d 20 28 72 43 6f 73  sorted) <= (rCos
27000 74 2c 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65 64  t,nOut,rUnsorted
27010 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
27020 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
27030 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a 20  ->rCost<rCost . 
27040 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
27050 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 0a  o->rCost==rCost.
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
27070 26 20 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75  & (pTo->nRow<nOu
27080 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
27090 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52       || (pTo->nR
270a0 6f 77 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f 2d  ow==nOut && pTo-
270b0 3e 72 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e 73  >rUnsorted<=rUns
270c0 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20 20  orted).         
270d0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
270e0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
270f0 20 20 20 20 20 29 7b 0a 23 69 66 64 65 66 20 57       ){.#ifdef W
27100 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
27110 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
27120 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
27130 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
27140 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
27150 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27160 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
27170 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
27180 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
27190 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
271a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
271b0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
271c0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
271d0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
271e0 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a  Out, rUnsorted,.
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27200 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
27210 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
27220 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
27230 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27240 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
27250 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
27260 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
27270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27280 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
27290 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
272a0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
272b0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
272c0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
272d0 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d  >rUnsorted, pTo-
272e0 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
272f0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
27300 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
27310 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
27320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27330 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69  iscard the candi
27340 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66  date path from f
27350 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61  urther considera
27360 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
27370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
27380 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
27390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
273a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
273b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
273c0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
273d0 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
273e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
273f0 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
27400 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  e if the candida
27410 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65  te path is bette
27420 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
27430 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68       ** pTo path
27440 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77  .  Replace pTo w
27450 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  ith the candidat
27460 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
27470 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
27480 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
27490 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
274a0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
274b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
274c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
274d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
274e0 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
274f0 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
27500 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
27510 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
27520 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
27530 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
27540 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f  ost, nOut, rUnso
27550 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
27560 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
27570 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
27580 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
27590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
275a0 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
275b0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
275c0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
275d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
275e0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
275f0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
27600 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
27610 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
27620 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72            pTo->r
27630 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69  Unsorted, pTo->i
27640 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
27650 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
27660 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
27670 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
27690 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
276a0 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
276b0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
276c0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
276d0 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
276e0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
276f0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
27700 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
27710 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
27720 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
27730 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
27740 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
27750 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
27760 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
27770 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  ed = rUnsorted;.
27780 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
27790 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
277a0 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
277b0 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
277c0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
277d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
277e0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
277f0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
27800 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
27810 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
27820 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
27830 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
27840 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
27850 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
27860 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
27870 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  d = aTo[0].nRow;
27880 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
27890 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
278a0 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
278b0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
278c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
278d0 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a  ->rCost>mxCost .
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
278f0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
27900 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  ost && pTo->rUns
27910 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64  orted>mxUnsorted
27920 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
27930 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27940 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
27950 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
27960 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
27970 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a  pTo->rUnsorted;.
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
27990 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
279a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
279b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
279c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
279d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
279e0 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
279f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
27a00 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32  hereTrace & 0x02
27a10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27a20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
27a30 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
27a40 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
27a50 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
27a60 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
27a70 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
27a80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27a90 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
27aa0 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
27ab0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
27ac0 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
27ad0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
27ae0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
27af0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
27b00 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
27b10 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
27b20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
27b30 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
27b40 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
27b50 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
27b60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27b70 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
27b80 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
27b90 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
27ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27bb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27bc0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
27bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27be0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
27bf0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
27c00 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
27c10 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
27c20 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
27c30 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
27c40 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
27c50 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
27c60 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
27c70 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
27c80 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
27c90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27ca0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
27cb0 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
27cc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
27cd0 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b  eNN(db, pSpace);
27ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27cf0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
27d00 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c  .  /* Find the l
27d10 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e  owest cost path.
27d20 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20    pFrom will be 
27d30 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
27d40 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20   that path */.  
27d50 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20  pFrom = aFrom;. 
27d60 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46   for(ii=1; ii<nF
27d70 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  rom; ii++){.    
27d80 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  if( pFrom->rCost
27d90 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74  >aFrom[ii].rCost
27da0 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f   ) pFrom = &aFro
27db0 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  m[ii];.  }.  ass
27dc0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
27dd0 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20  vel==nLoop );.  
27de0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65  /* Load the lowe
27df0 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74  st cost path int
27e00 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f  o pWInfo */.  fo
27e10 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
27e20 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
27e30 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c  {.    WhereLevel
27e40 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66   *pLevel = pWInf
27e50 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20  o->a + iLoop;.  
27e60 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70    pLevel->pWLoop
27e70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f   = pWLoop = pFro
27e80 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b  m->aLoop[iLoop];
27e90 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
27ea0 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61  om = pWLoop->iTa
27eb0 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  b;.    pLevel->i
27ec0 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d  TabCur = pWInfo-
27ed0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
27ee0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72  vel->iFrom].iCur
27ef0 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  sor;.  }.  if( (
27f00 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27f10 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
27f20 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20  DISTINCT)!=0.   
27f30 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
27f40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
27f50 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20  ISTINCTBY)==0.  
27f60 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73   && pWInfo->eDis
27f70 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53  tinct==WHERE_DIS
27f80 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26  TINCT_NOOP.   &&
27f90 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20   nRowEst.  ){.  
27fa0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65    Bitmask notUse
27fb0 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
27fc0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
27fd0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
27fe0 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c  , pWInfo->pResul
27ff0 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20  tSet, pFrom,.   
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
28010 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20  ERE_DISTINCTBY, 
28020 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
28030 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
28040 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
28050 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70  f( rc==pWInfo->p
28060 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72  ResultSet->nExpr
28070 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
28080 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
28090 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
280a0 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ERED;.    }.  }.
280b0 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72    pWInfo->bOrder
280c0 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 30 3b  edInnerLoop = 0;
280d0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
280e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
280f0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
28100 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
28110 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
28120 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
28130 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
28140 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
28150 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
28160 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
28170 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
28180 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
28190 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
281a0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
281b0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
281c0 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  d;.      pWInfo-
281d0 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d  >revMask = pFrom
281e0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
281f0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
28200 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sat<=0 ){.      
28210 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
28220 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
28230 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20  ( nLoop>0 ){.   
28240 20 20 20 20 20 20 20 75 33 32 20 77 73 46 6c 61         u32 wsFla
28250 67 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  gs = pFrom->aLoo
28260 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c  p[nLoop-1]->wsFl
28270 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
28280 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  f( (wsFlags & WH
28290 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a  ERE_ONEROW)==0 .
282a0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77             && (w
282b0 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 49 50  sFlags&(WHERE_IP
282c0 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  K|WHERE_COLUMN_I
282d0 4e 29 29 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c  N))!=(WHERE_IPK|
282e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
282f0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
28300 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
28310 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k m = 0;.       
28320 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68       int rc = wh
28330 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
28340 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
28350 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
28360 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
28380 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
28390 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  IT, nLoop-1, pFr
283a0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
283b0 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20  1], &m);.       
283c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
283d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
283e0 50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  PK );.          
283f0 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
28400 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
28410 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20  MN_IN );.       
28420 20 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49       if( rc==pWI
28430 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
28440 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
28450 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f        pWInfo->bO
28460 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
28470 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
28480 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
28490 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20  sk = m;.        
284a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
284b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
284c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
284d0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
284e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
284f0 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20  RTBYGROUP).     
28500 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
28510 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  BSat==pWInfo->pO
28520 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26  rderBy->nExpr &&
28530 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a   nLoop>0.    ){.
28540 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
28550 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  vMask = 0;.     
28560 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68   int nOrder = wh
28570 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
28580 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
28590 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
285a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
285b0 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  om, 0, nLoop-1, 
285c0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
285d0 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a  op-1], &revMask.
285e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
285f0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73  ssert( pWInfo->s
28600 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  orted==0 );.    
28610 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57    if( nOrder==pW
28620 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
28630 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
28640 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20   pWInfo->sorted 
28650 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49  = 1;.        pWI
28660 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72  nfo->revMask = r
28670 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  evMask;.      }.
28680 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57      }.  }...  pW
28690 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
286a0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
286b0 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
286c0 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
286d0 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
286e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
286f0 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
28700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20  ;.}../*.** Most 
28720 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79  queries use only
28730 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
28740 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f  (they are not jo
28750 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a  ins) and have.**
28760 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74   simple == const
28770 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69  raints against i
28780 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20  ndexed fields.  
28790 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
287a0 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e  empts.** to plan
287b0 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61   those simple ca
287c0 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c  ses using much l
287d0 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61  ess ceremony tha
287e0 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c  n the.** general
287f0 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
28800 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72  lanner, and ther
28810 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72  eby yield faster
28820 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
28830 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20  ().** times for 
28840 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
28850 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
28860 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n-zero on succes
28870 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79  s, if this query
28880 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20   can be handled 
28890 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72  by this.** no-fr
288a0 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e  ills query plann
288b0 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  er.  Return zero
288c0 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e   if this query n
288d0 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e  eeds the .** gen
288e0 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
288f0 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
28900 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53  tatic int whereS
28910 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f  hortCut(WhereLoo
28920 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
28930 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
28940 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75   *pWInfo;.  stru
28950 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28960 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
28970 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
28980 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
28990 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
289a0 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  op;.  int iCur;.
289b0 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
289c0 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
289d0 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f  *pIdx;..  pWInfo
289e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
289f0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
28a00 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
28a10 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28a20 53 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  SE ) return 0;. 
28a30 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
28a40 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
28a50 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
28a60 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28a70 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
28a80 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
28a90 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
28aa0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
28ab0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
28ac0 6e 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72  ndexedBy ) retur
28ad0 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  n 0;.  iCur = pI
28ae0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
28af0 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
28b00 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42  WC;.  pLoop = pB
28b10 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
28b20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
28b30 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b   0;.  pLoop->nSk
28b40 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  ip = 0;.  pTerm 
28b50 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
28b60 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
28b70 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57  , -1, 0, WO_EQ|W
28b80 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_IS, 0);.  if( 
28b90 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73  pTerm ){.    tes
28ba0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
28bb0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
28bc0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
28bd0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
28be0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50  LUMN_EQ|WHERE_IP
28bf0 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  K|WHERE_ONEROW;.
28c00 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
28c10 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
28c20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
28c30 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  = 1;.    pLoop->
28c40 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
28c50 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
28c60 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20  Cost of a rowid 
28c70 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a  lookup is 10 */.
28c80 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
28c90 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71  = 33;  /* 33==sq
28ca0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
28cb0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
28cc0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
28cd0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
28ce0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
28cf0 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b        int opMask
28d00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28d10 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
28d20 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
28d30 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  m );.      if( !
28d40 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
28d50 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  dx).       || pI
28d60 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
28d70 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e!=0 .       || 
28d80 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72  pIdx->nKeyCol>Ar
28d90 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
28da0 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20  LTermSpace) .   
28db0 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20     ) continue;. 
28dc0 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49       opMask = pI
28dd0 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
28de0 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  ? (WO_EQ|WO_IS) 
28df0 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66  : WO_EQ;.      f
28e00 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
28e10 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
28e20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73         pTerm = s
28e30 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
28e40 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
28e50 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64  , 0, opMask, pId
28e60 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
28e70 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
28e80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28e90 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28ea0 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
28eb0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
28ec0 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d  LTerm[j] = pTerm
28ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28ee0 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65  if( j!=pIdx->nKe
28ef0 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  yCol ) continue;
28f00 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  .      pLoop->ws
28f10 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
28f20 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e  LUMN_EQ|WHERE_ON
28f30 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58  EROW|WHERE_INDEX
28f40 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ED;.      if( pI
28f50 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c  dx->isCovering |
28f60 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  | (pItem->colUse
28f70 64 20 26 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74  d & pIdx->colNot
28f80 49 64 78 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Idxed)==0 ){.   
28f90 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
28fa0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
28fb0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
28fc0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
28fd0 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
28fe0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
28ff0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
29000 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
29010 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
29020 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
29030 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
29040 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
29050 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
29060 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
29070 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
29080 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
29090 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
290a0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
290b0 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
290c0 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
290d0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
290e0 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
290f0 6f 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  op;.    assert( 
29100 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
29110 2e 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d 70  .n==1 && iCur==p
29120 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e  WInfo->sMaskSet.
29130 69 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c 6f  ix[0] );.    pLo
29140 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 31  op->maskSelf = 1
29150 3b 20 2f 2a 20 73 71 6c 69 74 65 33 57 68 65 72  ; /* sqlite3Wher
29160 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
29170 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
29180 29 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  ); */.    pWInfo
29190 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
291a0 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
291b0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
291c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
291d0 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
291e0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49  o->nOBSat =  pWI
291f0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
29200 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57  Expr;.    if( pW
29210 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29220 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
29230 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
29240 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
29250 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
29260 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
29270 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29280 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
29290 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
292a0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
292b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
292c0 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
292d0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 78 70  function for exp
292e0 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63  rIsDeterministic
292f0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
29300 74 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65  t exprNodeIsDete
29310 72 6d 69 6e 69 73 74 69 63 28 57 61 6c 6b 65 72  rministic(Walker
29320 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
29330 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
29340 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
29350 43 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73  CTION && ExprHas
29360 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
29370 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3d 3d 30  EP_ConstFunc)==0
29380 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
29390 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
293a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
293b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
293c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
293d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
293e0 65 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  e if the express
293f0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ion contains no 
29400 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
29410 63 20 53 51 4c 20 0a 2a 2a 20 66 75 6e 63 74 69  c SQL .** functi
29420 6f 6e 73 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e 73  ons. Do not cons
29430 69 64 65 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  ider non-determi
29440 6e 69 73 74 69 63 20 53 51 4c 20 66 75 6e 63 74  nistic SQL funct
29450 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 0a 2a  ions that are .*
29460 2a 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65  * part of sub-se
29470 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
29480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
29490 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74  xprIsDeterminist
294a0 69 63 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ic(Expr *p){.  W
294b0 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
294c0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
294d0 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  w));.  w.eCode =
294e0 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
294f0 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
29500 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 3b  IsDeterministic;
29510 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29520 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
29530 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 20 20  lectWalkFail;.  
29540 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
29550 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
29560 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
29570 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
29580 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
29590 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
295a0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
295b0 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
295c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
295d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
295e0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
295f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
29600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
29610 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
29620 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
29630 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
29640 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
29650 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
29660 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
29670 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
29680 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
29690 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
296a0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
296b0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
296c0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
296d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
296e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
296f0 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
29700 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
29710 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
29720 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
29730 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
29740 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
29750 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
29760 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
29770 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
29780 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
29790 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
297a0 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
297b0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
297c0 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
297d0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
297e0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
297f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
29800 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
29810 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
29820 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
29830 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
29840 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
29850 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
29860 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
29870 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
29880 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
29890 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
298a0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
298b0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
298c0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
298d0 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
298e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
298f0 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
29900 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
29910 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
29920 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
29930 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
29940 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
29950 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
29980 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
29990 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
299c0 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
299d0 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
299e0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
299f0 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
29a00 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
29a10 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
29a20 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
29a30 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
29a40 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
29a50 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
29a60 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
29a70 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
29a80 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
29a90 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
29aa0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
29ab0 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
29ac0 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
29ad0 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
29ae0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
29af0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
29b00 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
29b10 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
29b20 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
29b30 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
29b40 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
29b50 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
29b60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
29b70 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
29b80 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
29b90 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
29ba0 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
29bb0 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
29bc0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
29bd0 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
29be0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
29bf0 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
29c00 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
29c10 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
29c20 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
29c30 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
29c40 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
29c50 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
29c60 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
29c70 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
29c80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
29c90 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
29ca0 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
29cb0 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
29cc0 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
29cd0 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
29ce0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
29cf0 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
29d00 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
29d10 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
29d20 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
29d30 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
29d40 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
29d50 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
29d60 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
29d70 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
29d80 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
29d90 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
29da0 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
29db0 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
29dc0 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
29dd0 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
29de0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
29df0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
29e00 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
29e10 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
29e20 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
29e30 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
29e40 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
29e50 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
29e60 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
29e70 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
29e80 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
29e90 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
29ea0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
29eb0 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
29ec0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
29ed0 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
29ee0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
29ef0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29f00 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
29f10 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
29f20 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
29f30 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
29f40 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
29f50 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
29f60 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
29f70 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
29f80 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
29f90 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
29fa0 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
29fb0 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
29fc0 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
29fd0 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
29fe0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
29ff0 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
2a000 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
2a010 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
2a020 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
2a030 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
2a040 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
2a050 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
2a060 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
2a070 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
2a080 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
2a090 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
2a0a0 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
2a0b0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2a0c0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
2a0d0 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
2a0e0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
2a0f0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
2a100 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
2a110 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
2a120 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
2a130 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
2a140 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
2a150 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
2a160 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
2a170 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
2a180 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
2a190 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
2a1a0 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
2a1b0 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
2a1c0 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
2a1d0 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
2a1e0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
2a1f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
2a200 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
2a210 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
2a220 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
2a230 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
2a240 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
2a250 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
2a260 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
2a270 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
2a280 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
2a290 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
2a2a0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
2a2b0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
2a2c0 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
2a2d0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
2a2e0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
2a2f0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
2a300 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70  ** The iIdxCur p
2a310 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
2a320 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
2a330 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a   an index.  If .
2a340 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  ** WHERE_OR_SUBC
2a350 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49  LAUSE is set, iI
2a360 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72  dxCur is the cur
2a370 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
2a380 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65   index.** to use
2a390 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
2a3a0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20  rocessing.  The 
2a3b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f  WHERE clause sho
2a3c0 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  uld use this.** 
2a3d0 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e  specific cursor.
2a3e0 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41    If WHERE_ONEPA
2a3f0 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65  SS_DESIRED is se
2a400 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20  t, then iIdxCur 
2a410 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
2a420 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72  cursor in an arr
2a430 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f  ay of cursors fo
2a440 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20  r all indices.  
2a450 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a  iIdxCur should.*
2a460 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d  * be used to com
2a470 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  pute the appropr
2a480 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65  iate cursor depe
2a490 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69  nding on which i
2a4a0 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e  ndex is.** used.
2a4b0 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
2a4c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a4d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2a4e0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2a4f0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2a500 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
2a510 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f  pTabList,      /
2a520 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
2a530 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
2a540 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
2a550 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
2a560 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ere,           /
2a570 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2a580 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2a590 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
2a5a0 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28  /* An ORDER BY (
2a5b0 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
2a5c0 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
2a5d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
2a5e0 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51 75 65  ultSet,   /* Que
2a5f0 72 79 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  ry result set.  
2a600 52 65 71 27 64 20 66 6f 72 20 44 49 53 54 49 4e  Req'd for DISTIN
2a610 43 54 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  CT */.  u16 wctr
2a620 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  lFlags,         
2a630 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20 66  /* The WHERE_* f
2a640 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
2a650 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
2a660 20 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20   int iAuxArg    
2a670 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57           /* If W
2a680 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2a690 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  E is set, index 
2a6a0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57 48          ** If WH
2a6d0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74  ERE_USE_LIMIT, t
2a6e0 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61 6d  hen the limit am
2a6f0 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ount */.){.  int
2a700 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
2a710 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
2a720 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
2a730 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
2a740 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
2a750 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2a760 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a770 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
2a780 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
2a790 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2a7a0 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
2a7b0 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
2a7c0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
2a7d0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
2a7e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2a7f0 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
2a800 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
2a810 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
2a820 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
2a830 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2a840 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
2a850 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
2a860 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2a870 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
2a880 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
2a890 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
2a8a0 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2a8b0 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
2a8c0 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
2a8d0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
2a8e0 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
2a8f0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
2a900 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
2a910 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2a920 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
2a930 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2a940 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
2a950 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
2a960 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2a970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2a980 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2a990 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2a9a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2a9b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a9c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a9f0 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c   */.  u8 bFordel
2aa00 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
2aa10 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45   /* OPFLAG_FORDE
2aa20 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73  LETE or zero, as
2aa30 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
2aa40 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2aa50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2aa60 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2aa70 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20  ==0 || (.       
2aa80 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2aa90 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2aaa0 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26  IRED)!=0 .     &
2aab0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2aac0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2aad0 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20  SE)==0 .  ));.. 
2aae0 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20   /* Only one of 
2aaf0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2ab00 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45 5f  SE or WHERE_USE_
2ab10 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65 72  LIMIT */.  asser
2ab20 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
2ab30 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2ab40 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  USE)==0.        
2ab50 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61      || (wctrlFla
2ab60 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
2ab70 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  IMIT)==0 );..  /
2ab80 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
2ab90 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64  alization */.  d
2aba0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2abb0 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
2abc0 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
2abd0 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  ;..  /* An ORDER
2abe0 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65  /GROUP BY clause
2abf0 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33   of more than 63
2ac00 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65   terms cannot be
2ac10 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20   optimized */.  
2ac20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72  testcase( pOrder
2ac30 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
2ac40 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a  nExpr==BMS-1 );.
2ac50 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
2ac60 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
2ac70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42  r>=BMS ) pOrderB
2ac80 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f  y = 0;.  sWLB.pO
2ac90 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2aca0 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  y;..  /* Disable
2acb0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
2acc0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
2acd0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
2ace0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
2acf0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
2ad00 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
2ad10 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
2ad20 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
2ad30 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
2ad40 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
2ad50 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20  istinctOpt) ){. 
2ad60 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d     wctrlFlags &=
2ad70 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53   ~WHERE_WANT_DIS
2ad80 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TINCT;.  }..  /*
2ad90 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
2ada0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2adb0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2adc0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2add0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
2ade0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
2adf0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
2ae00 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
2ae10 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
2ae20 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
2ae30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2ae40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
2ae50 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
2ae60 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
2ae70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2ae80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
2ae90 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
2aea0 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
2aeb0 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
2aec0 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
2aed0 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
2aee0 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52 5f  if the WHERE_OR_
2aef0 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69  SUBCLAUSE flag i
2af00 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
2af10 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
2af20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
2af30 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
2af40 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
2af50 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
2af60 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
2af70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
2af80 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
2af90 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
2afa0 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
2afb0 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
2afc0 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2afd0 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70 54  CLAUSE) ? 1 : pT
2afe0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20  abList->nSrc;.. 
2aff0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2b000 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
2b010 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2b020 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
2b030 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
2b040 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69  turn value. A si
2b050 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ngle allocation 
2b060 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
2b070 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20   the WhereInfo. 
2b080 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20   ** struct, the 
2b090 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72  contents of Wher
2b0a0 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57  eInfo.a[], the W
2b0b0 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
2b0c0 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ture.  ** and th
2b0d0 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
2b0e0 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20  tructure. Since 
2b0f0 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74  WhereClause cont
2b100 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20  ains an 8-byte. 
2b110 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20   ** field (type 
2b120 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74  Bitmask) it must
2b130 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61   be aligned on a
2b140 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
2b150 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61  y on.  ** some a
2b160 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65  rchitectures. He
2b170 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29  nce the ROUND8()
2b180 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e   below..  */.  n
2b190 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
2b1a0 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
2b1b0 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
2b1c0 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
2b1d0 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
2b1e0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2b1f0 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65  cRawNN(db, nByte
2b200 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57  WInfo + sizeof(W
2b210 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66  hereLoop));.  if
2b220 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b230 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
2b240 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
2b250 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
2b260 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
2b270 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2b280 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61   }.  pWInfo->pPa
2b290 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2b2a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2b2b0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
2b2c0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2b2d0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
2b2e0 49 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20 70  Info->pWhere = p
2b2f0 57 68 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Where;.  pWInfo-
2b300 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
2b310 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
2b320 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
2b330 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69  [0] = pWInfo->ai
2b340 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
2b350 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c  -1;.  pWInfo->nL
2b360 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
2b370 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
2b380 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  k = pWInfo->iCon
2b390 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
2b3a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
2b3b0 72 73 65 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  rse);.  pWInfo->
2b3c0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
2b3d0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
2b3e0 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
2b3f0 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
2b400 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
2b410 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2b420 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  oop;.  memset(&p
2b430 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30  WInfo->nOBSat, 0
2b440 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73  , .         offs
2b450 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73  etof(WhereInfo,s
2b460 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57  WC) - offsetof(W
2b470 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29  hereInfo,nOBSat)
2b480 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  );.  memset(&pWI
2b490 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  nfo->a[0], 0, si
2b4a0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b  zeof(WhereLoop)+
2b4b0 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28  nTabList*sizeof(
2b4c0 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2b4d0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2b4e0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2b4f0 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45  S_OFF );  /* ONE
2b500 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f  PASS defaults to
2b510 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53   OFF */.  pMaskS
2b520 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
2b530 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
2b540 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
2b550 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
2b560 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
2b570 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
2b580 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
2b590 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
2b5a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2b5b0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2b5c0 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
2b5d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
2b5e0 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
2b5f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2b600 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
2b610 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
2b620 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
2b630 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
2b640 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
2b650 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
2b660 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
2b670 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
2b680 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
2b690 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
2b6a0 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
2b6b0 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  Set);.  sqlite3W
2b6c0 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
2b6d0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
2b6e0 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  nfo);.  sqlite3W
2b6f0 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
2b700 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
2b710 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
2b720 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
2b730 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
2b740 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
2b750 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
2b760 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
2b770 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
2b780 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2b790 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
2b7a0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2b7b0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
2b7c0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2b7d0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2b7e0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
2b7f0 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  }.    ExplainQue
2b800 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
2b810 30 2c 20 22 53 43 41 4e 20 43 4f 4e 53 54 41 4e  0, "SCAN CONSTAN
2b820 54 20 52 4f 57 22 29 29 3b 0a 20 20 7d 65 6c 73  T ROW"));.  }els
2b830 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  e{.    /* Assign
2b840 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2b850 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2b860 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2b870 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  M clause..    **
2b880 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68  .    ** The N-th
2b890 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
2b8a0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69  M clause is assi
2b8b0 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f  gned a bitmask o
2b8c0 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a 0a 20  f 1<<N..    **. 
2b8d0 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f     ** The rule o
2b8e0 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
2b8f0 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
2b900 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
2b910 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 20   bitmask for.   
2b920 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74   ** a table T, t
2b930 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62  hen X-1 is the b
2b940 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f  itmask for all o
2b950 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74  ther tables to t
2b960 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20  he left of T..  
2b970 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
2b980 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2b990 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2b9a0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2b9b0 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d 70  in is.    ** imp
2b9c0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2b9d0 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a 20 20  #3015..    **.  
2b9e0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2b9f0 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2ba00 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2ba10 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2ba20 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54 61 62  s in.    ** pTab
2ba30 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
2ba40 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
2ba50 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
2ba60 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
2ba70 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20      ** equal to 
2ba80 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
2ba90 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
2baa0 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
2bab0 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 5f 4f  e.    ** WHERE_O
2bac0 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
2bad0 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a   is set..    */.
2bae0 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20 20 20      ii = 0;.    
2baf0 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65  do{.      create
2bb00 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2bb10 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2bb20 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
2bb30 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75  qlite3WhereTabFu
2bb40 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26  ncArgs(pParse, &
2bb50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c  pTabList->a[ii],
2bb60 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
2bb70 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 69      }while( (++i
2bb80 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  i)<pTabList->nSr
2bb90 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51  c );.  #ifdef SQ
2bba0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
2bbb0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2bbc0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  x = 0;.      for
2bbd0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
2bbe0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
2bbf0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2bc00 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
2bc10 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
2bc20 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2bc30 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2bc40 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e 3d       assert( m>=
2bc50 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 78  mx );.        mx
2bc60 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = m;.      }.  
2bc70 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
2bc80 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  .  .  /* Analyze
2bc90 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2bca0 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2bcb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2bcc0 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
2bcd0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
2bce0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2bcf0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2bd00 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2bd10 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
2bd20 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d 73  ase: WHERE terms
2bd30 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 66   that do not ref
2bd40 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 73  er to any tables
2bd50 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20 2a   in the join.  *
2bd60 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  * (constant expr
2bd70 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75 61  essions). Evalua
2bd80 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65 72  te each such ter
2bd90 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65 72  m, and jump over
2bda0 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67 65   all the.  ** ge
2bdb0 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66 20  nerated code if 
2bdc0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
2bdd0 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a 20  t true.  .  **. 
2bde0 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   ** Do not do th
2bdf0 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65 73  is if the expres
2be00 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
2be10 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
2be20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74  functions.  ** t
2be30 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68  hat are not with
2be40 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  in a sub-select.
2be50 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74 72   This is not str
2be60 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c 20  ictly required, 
2be70 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72 76  but.  ** preserv
2be80 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67 61  es SQLite's lega
2be90 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  cy behaviour in 
2bea0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2beb0 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20 20  o cases:.  **.  
2bec0 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  **   FROM ... WH
2bed0 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b 20  ERE random()>0; 
2bee0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76 61            -- eva
2bef0 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20  l random() once 
2bf00 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20 46  per row.  **   F
2bf10 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28 53  ROM ... WHERE (S
2bf20 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29 3e  ELECT random())>
2bf30 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64  0;  -- eval rand
2bf40 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61 6c  om() once overal
2bf50 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  l.  */.  for(ii=
2bf60 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
2bf70 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2bf80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 20    WhereTerm *pT 
2bf90 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  = &sWLB.pWC->a[i
2bfa0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e  i];.    if( pT->
2bfb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2bfc0 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75  IRTUAL ) continu
2bfd0 65 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e 70  e;.    if( pT->p
2bfe0 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26 20 28  rereqAll==0 && (
2bff0 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 65  nTabList==0 || e
2c000 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74  xprIsDeterminist
2c010 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29 20 29  ic(pT->pExpr)) )
2c020 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2c030 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2c040 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20 70 57  e, pT->pExpr, pW
2c050 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2c060 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2c070 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74 46 6c  ;.      pT->wtFl
2c080 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2c090 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
2c0a0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2c0b0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2c0c0 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
2c0d0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
2c0e0 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
2c0f0 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
2c100 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
2c110 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2c120 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
2c130 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
2c140 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
2c150 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2c160 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2c170 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2c180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
2c190 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
2c1a0 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
2c1b0 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
2c1c0 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
2c1d0 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
2c1e0 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
2c1f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2c200 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
2c210 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
2c220 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
2c230 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
2c240 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
2c250 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
2c260 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2c270 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
2c280 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
2c290 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2c2a0 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66 66  reTrace & 0xffff
2c2b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2c2c0 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20  ebugPrintf("*** 
2c2d0 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
2c2e0 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a  *** (wctrlFlags:
2c2f0 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61 67   0x%x",wctrlFlag
2c300 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  s);.    if( wctr
2c310 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
2c320 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  SE_LIMIT ){.    
2c330 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2c340 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25  intf(", limit: %
2c350 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20 20  d", iAuxArg);.  
2c360 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2c370 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e 22  ebugPrintf(")\n"
2c380 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
2c390 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
2c3a0 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 53 65  x100 ){.      Se
2c3b0 6c 65 63 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  lect sSelect;.  
2c3c0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 65 6c      memset(&sSel
2c3d0 65 63 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ect, 0, sizeof(s
2c3e0 53 65 6c 65 63 74 29 29 3b 0a 20 20 20 20 20 20  Select));.      
2c3f0 73 53 65 6c 65 63 74 2e 73 65 6c 46 6c 61 67 73  sSelect.selFlags
2c400 20 3d 20 53 46 5f 57 68 65 72 65 42 65 67 69 6e   = SF_WhereBegin
2c410 3b 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e  ;.      sSelect.
2c420 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 3b  pSrc = pTabList;
2c430 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e 70  .      sSelect.p
2c440 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
2c450 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e 70 4f        sSelect.pO
2c460 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2c470 79 3b 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74  y;.      sSelect
2c480 2e 70 45 4c 69 73 74 20 3d 20 70 52 65 73 75 6c  .pEList = pResul
2c490 74 53 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  tSet;.      sqli
2c4a0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2c4b0 74 28 30 2c 20 26 73 53 65 6c 65 63 74 2c 20 30  t(0, &sSelect, 0
2c4c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
2c4d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2c4e0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 20  race & 0x100 ){ 
2c4f0 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74  /* Display all t
2c500 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2c510 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
2c520 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
2c530 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43  sePrint(sWLB.pWC
2c540 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2c550 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
2c560 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
2c570 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
2c580 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2c590 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
2c5a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c5b0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2c5c0 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45  r;.  .#ifdef WHE
2c5d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2c5e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2c5f0 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20  hereTrace ){    
2c600 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
2c610 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2c620 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  objects */.     
2c630 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
2c640 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2c650 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2c660 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
2c670 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
2c680 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2c690 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6c0 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
2c6d0 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b  MNOPQRSTUVWYXZ";
2c6e0 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49  .      for(p=pWI
2c6f0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30  nfo->pLoops, i=0
2c700 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
2c710 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  oop, i++){.     
2c720 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
2c730 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61  el[i%(sizeof(zLa
2c740 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20  bel)-1)];.      
2c750 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
2c760 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
2c770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2c780 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
2c790 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2c7a0 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
2c7b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c7c0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2c7d0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
2c7e0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2c7f0 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
2c800 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2c810 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
2c820 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
2c830 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2c840 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2c850 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
2c860 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
2c870 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
2c880 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
2c890 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
2c8a0 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
2c8b0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
2c8c0 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20   ALLBITS;.  }.  
2c8d0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2c8e0 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
2c8f0 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
2c900 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2c910 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
2c920 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2c930 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2c940 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
2c950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
2c960 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
2c970 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
2c980 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
2c990 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
2c9a0 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
2c9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2c9c0 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
2c9d0 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
2c9e0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
2c9f0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
2ca00 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
2ca10 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
2ca20 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
2ca30 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
2ca40 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
2ca50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2ca60 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2ca70 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
2ca80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ca90 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
2caa0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2cab0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
2cac0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2cad0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2cae0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2caf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cb00 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2cb10 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2cb20 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
2cb30 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2cb40 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2cb50 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
2cb60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2cb70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2cb80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2cb90 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
2cba0 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
2cbb0 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
2cbc0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2cbd0 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
2cbe0 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
2cbf0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
2cc00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74  #endif..  /* Att
2cc10 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
2cc20 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
2cc30 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66  n that do not af
2cc40 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e  fect the result.
2cc50 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  .  ** For a tabl
2cc60 65 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20  e to not affect 
2cc70 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20  the result, the 
2cc80 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62  following must b
2cc90 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  e true:.  **.  *
2cca0 2a 20 20 20 31 29 20 54 68 65 20 71 75 65 72 79  *   1) The query
2ccb0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20   must not be an 
2ccc0 61 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20  aggregate..  ** 
2ccd0 20 20 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d    2) The table m
2cce0 75 73 74 20 62 65 20 74 68 65 20 52 48 53 20 6f  ust be the RHS o
2ccf0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
2cd00 20 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72 20   **   3) Either 
2cd10 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 62  the query must b
2cd20 65 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65  e DISTINCT, or e
2cd30 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  lse the ON or US
2cd40 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20  ING clause.  ** 
2cd50 20 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69       must contai
2cd60 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  n a constraint t
2cd70 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73  hat limits the s
2cd80 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  can of the table
2cd90 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61   to .  **      a
2cda0 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20  t most a single 
2cdb0 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54  row..  **   4) T
2cdc0 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f  he table must no
2cdd0 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64 20  t be referenced 
2cde0 62 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  by any part of t
2cdf0 68 65 20 71 75 65 72 79 20 61 70 61 72 74 0a 20  he query apart. 
2ce00 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74   **      from it
2ce10 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f  s own USING or O
2ce20 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  N clause..  **. 
2ce30 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c   ** For example,
2ce40 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a   given:.  **.  *
2ce50 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
2ce60 4c 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45  LE t1(ipk INTEGE
2ce70 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  R PRIMARY KEY, v
2ce80 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  1);.  **     CRE
2ce90 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b  ATE TABLE t2(ipk
2cea0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2ceb0 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20   KEY, v2);.  ** 
2cec0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2ced0 20 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t3(ipk INTEGER 
2cee0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29  PRIMARY KEY, v3)
2cef0 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e  ;.  **.  ** then
2cf00 20 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65   table t2 can be
2cf10 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
2cf20 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
2cf30 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2cf40 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31  T v1, v3 FROM t1
2cf50 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46   .  **       LEF
2cf60 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20  T JOIN t2 USING 
2cf70 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a  (t1.ipk=t2.ipk).
2cf80 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2cf90 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74  JOIN t3 USING (t
2cfa0 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20  1.ipk=t3.ipk).  
2cfb0 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a  **.  ** or from:
2cfc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2cfd0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 76  ELECT DISTINCT v
2cfe0 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20  1, v3 FROM t1 . 
2cff0 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a   **       LEFT J
2d000 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20  OIN t2.  **     
2d010 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55    LEFT JOIN t3 U
2d020 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e  SING (t1.ipk=t3.
2d030 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ipk).  */.  notR
2d040 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2d050 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  )0;.  if( pWInfo
2d060 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26  ->nLevel>=2.   &
2d070 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 20  & pResultSet!=0 
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d090 20 67 75 61 72 61 6e 74 65 65 73 20 63 6f 6e 64   guarantees cond
2d0a0 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 20  ition (1) above 
2d0b0 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  */.   && Optimiz
2d0c0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2d0d0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
2d0e0 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69  Join).  ){.    i
2d0f0 6e 74 20 69 3b 0a 20 20 20 20 42 69 74 6d 61 73  nt i;.    Bitmas
2d100 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69  k tabUsed = sqli
2d110 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
2d120 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2d130 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
2d140 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72   if( sWLB.pOrder
2d150 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55  By ){.      tabU
2d160 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  sed |= sqlite3Wh
2d170 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
2d180 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
2d190 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  pOrderBy);.    }
2d1a0 0a 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  .    for(i=pWInf
2d1b0 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2d1c0 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57  1; i--){.      W
2d1d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2d1e0 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 73 74   *pEnd;.      st
2d1f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2d200 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2d210 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
2d220 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  a[i].pWLoop;.   
2d230 20 20 20 70 49 74 65 6d 20 3d 20 26 70 57 49 6e     pItem = &pWIn
2d240 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2d250 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20  pLoop->iTab];.  
2d260 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
2d270 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2d280 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74  _LEFT)==0 ) cont
2d290 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2d2a0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2d2b0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2d2c0 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
2d2d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2d2e0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
2d2f0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
2d300 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2d310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d320 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
2d330 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2d340 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2d350 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
2d360 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
2d370 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
2d380 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
2d390 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
2d3a0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2d3b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
2d3c0 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
2d3d0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b  >maskSelf)!=0 ){
2d3e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2d3f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d400 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
2d410 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
2d420 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e        || pTerm->
2d430 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
2d440 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69  nTable!=pItem->i
2d450 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20 20 20  Cursor.         
2d460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d470 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2d480 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2d4a0 54 65 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74  Term<pEnd ) cont
2d4b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52  inue;.      WHER
2d4c0 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
2d4d0 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63  "-> drop loop %c
2d4e0 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c   not used\n", pL
2d4f0 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20  oop->cId));.    
2d500 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 70    notReady &= ~p
2d510 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2d520 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
2d530 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
2d540 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
2d550 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2d560 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2d570 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
2d580 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  lf)!=0 ){.      
2d590 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
2d5a0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
2d5b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d5c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 21    }.      if( i!
2d5d0 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2d5e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
2d5f0 20 6e 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f   nByte = (pWInfo
2d600 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20  ->nLevel-1-i) * 
2d610 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2d620 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d  l);.        memm
2d630 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  ove(&pWInfo->a[i
2d640 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b  ], &pWInfo->a[i+
2d650 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  1], nByte);.    
2d660 20 20 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f    }.      pWInfo
2d670 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
2d680 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
2d690 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
2d6a0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
2d6b0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
2d6c0 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
2d6d0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2d6e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
2d6f0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
2d700 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
2d710 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
2d720 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
2d730 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
2d740 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
2d750 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
2d760 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
2d770 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
2d780 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
2d790 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73  .  ** A one-pass
2d7a0 20 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65   approach can be
2d7b0 20 75 73 65 64 20 69 66 20 74 68 65 20 63 61 6c   used if the cal
2d7c0 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
2d7d0 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65  d one.  ** and e
2d7e0 69 74 68 65 72 20 28 61 29 20 74 68 65 20 73 63  ither (a) the sc
2d7f0 61 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f 73  an visits at mos
2d800 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62 29  t one row or (b)
2d810 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68   each.  ** of th
2d820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2d830 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
2d840 20 20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68    * the caller h
2d850 61 73 20 69 6e 64 69 63 61 74 65 64 20 74 68 61  as indicated tha
2d860 74 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70  t a one-pass app
2d870 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73 65  roach can be use
2d880 64 0a 20 20 2a 2a 20 20 20 20 20 77 69 74 68 20  d.  **     with 
2d890 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 28 62  multiple rows (b
2d8a0 79 20 73 65 74 74 69 6e 67 20 57 48 45 52 45 5f  y setting WHERE_
2d8b0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2d8c0 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20  ), and.  **   * 
2d8d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  the table is not
2d8e0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2d8f0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65  , and.  **   * e
2d900 69 74 68 65 72 20 74 68 65 20 73 63 61 6e 20 64  ither the scan d
2d910 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20  oes not use the 
2d920 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
2d930 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20  or the caller.  
2d940 2a 2a 20 20 20 20 20 69 73 20 61 20 44 45 4c 45  **     is a DELE
2d950 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 28 57 48  TE operation (WH
2d960 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
2d970 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65 63 69 66  K is only specif
2d980 69 65 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72  ied.  **     for
2d990 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20   DELETE)..  **. 
2d9a0 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 71 75 61   ** The last qua
2d9b0 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 62 65  lification is be
2d9c0 63 61 75 73 65 20 61 6e 20 55 50 44 41 54 45 20  cause an UPDATE 
2d9d0 73 74 61 74 65 6d 65 6e 74 20 75 73 65 73 0a 20  statement uses. 
2d9e0 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 69   ** WhereInfo.ai
2d9f0 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f  CurOnePass[1] to
2da00 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2da10 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 72 65 61  er or not it rea
2da20 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65  lly can.  ** use
2da30 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72   a one-pass appr
2da40 6f 61 63 68 2c 20 61 6e 64 20 74 68 69 73 20 69  oach, and this i
2da50 73 20 6e 6f 74 20 73 65 74 20 61 63 63 75 72 61  s not set accura
2da60 74 65 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a 20  tely for scans. 
2da70 20 2a 2a 20 74 68 61 74 20 75 73 65 20 74 68 65   ** that use the
2da80 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
2da90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2daa0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2dab0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2dac0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2dad0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2dae0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2daf0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2db00 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
2db10 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
2db20 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
2db30 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2db40 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
2db50 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
2db60 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
2db70 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28 77  .    assert( !(w
2db80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2db90 49 52 54 55 41 4c 54 41 42 4c 45 29 20 7c 7c 20  IRTUALTABLE) || 
2dba0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69  IsVirtual(pTabLi
2dbb0 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  st->a[0].pTab) )
2dbc0 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f  ;.    if( bOnero
2dbd0 77 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 30  w || (.        0
2dbe0 21 3d 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  !=(wctrlFlags & 
2dbf0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2dc00 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 26 26 20  LTIROW).     && 
2dc10 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c  !IsVirtual(pTabL
2dc20 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 0a  ist->a[0].pTab).
2dc30 20 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73 46       && (0==(wsF
2dc40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
2dc50 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
2dc60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
2dc70 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20 20  PLICATES_OK)).  
2dc80 20 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49 6e    )){.      pWIn
2dc90 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62  fo->eOnePass = b
2dca0 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53  Onerow ? ONEPASS
2dcb0 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53  _SINGLE : ONEPAS
2dcc0 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69  S_MULTI;.      i
2dcd0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
2dce0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  List->a[0].pTab)
2dcf0 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57   && (wsFlags & W
2dd00 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2dd10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63  {.        if( wc
2dd20 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2dd30 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
2dd40 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  W ){.          b
2dd50 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c  Fordelete = OPFL
2dd60 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20  AG_FORDELETE;.  
2dd70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dd80 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
2dd90 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  oop->wsFlags = (
2dda0 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45  wsFlags & ~WHERE
2ddb0 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  _IDX_ONLY);.    
2ddc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ddd0 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
2dde0 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
2ddf0 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
2de00 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
2de10 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
2de20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2de30 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  */.  for(ii=0, p
2de40 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2de50 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
2de60 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2de70 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
2de80 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
2de90 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
2dea0 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
2deb0 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
2dec0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
2ded0 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  le/index */.    
2dee0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2def0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a  tem *pTabItem;..
2df00 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
2df10 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2df20 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2df30 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2df40 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
2df50 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2df60 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
2df70 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c  pSchema);.    pL
2df80 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2df90 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
2dfa0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2dfb0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
2dfc0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
2dfd0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t ){.      /* Do
2dfe0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
2dff0 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  }else.#ifndef SQ
2e000 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e010 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28  LTABLE.    if( (
2e020 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2e030 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2e040 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
2e050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54   const char *pVT
2e060 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
2e070 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
2e080 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
2e090 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
2e0a0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2e0b0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2e0c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2e0d0 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c  _VOpen, iCur, 0,
2e0e0 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54   0, pVTab, P4_VT
2e0f0 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  AB);.    }else i
2e100 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
2e110 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  b) ){.      /* n
2e120 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  oop */.    }else
2e130 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2e140 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2e150 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2e160 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2e170 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2e180 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2e190 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
2e1a0 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
2e1b0 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
2e1c0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
2e1d0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
2e1e0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2e1f0 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
2e200 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
2e210 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61  OnePass[0] = pTa
2e220 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
2e230 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73        };.      s
2e240 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
2e250 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
2e260 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
2e270 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
2e280 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
2e290 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76  m->iCursor==pLev
2e2a0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20  el->iTabCur );. 
2e2b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2e2c0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2e2d0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
2e2e0 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
2e2f0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
2e300 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
2e310 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2e320 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2e330 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
2e340 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2e350 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2e360 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
2e370 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70  MS && HasRowid(p
2e380 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2e390 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
2e3a0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
2e3b0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
2e3c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
2e3d0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
2e3e0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2e3f0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2e400 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f   -1, SQLITE_INT_
2e410 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
2e420 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
2e430 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
2e440 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Col );.      }.#
2e450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2e460 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
2e470 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2e480 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2e490 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
2e4a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2e4b0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
2e4c0 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b  KEQ|bFordelete);
2e4d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2e4e0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
2e4f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e500 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64  hangeP5(v, bFord
2e510 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  elete);.      }.
2e520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2e530 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2e540 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69  _MASK.      sqli
2e550 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
2e560 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
2e570 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  sed, pTabItem->i
2e580 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20  Cursor, 0, 0,.  
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5a0 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
2e5b0 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e   u8*)&pTabItem->
2e5c0 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36  colUsed, P4_INT6
2e5d0 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  4);.#endif.    }
2e5e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2e5f0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2e600 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2e610 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2e620 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
2e630 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2e640 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2e650 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
2e660 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
2e670 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2e680 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65  .      int iInde
2e690 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  xCur;.      int 
2e6a0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
2e6b0 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41  ;.      /* iAuxA
2e6c0 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  rg is always set
2e6d0 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
2e6e0 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
2e6f0 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
2e700 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75       assert( iAu
2e710 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xArg!=0 || (pWIn
2e720 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2e730 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2e740 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
2e750 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2e760 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69  d(pTab) && IsPri
2e770 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78  maryKeyIndex(pIx
2e780 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74  ).       && (wct
2e790 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2e7a0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30  OR_SUBCLAUSE)!=0
2e7b0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2e7c0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65    /* This is one
2e7d0 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f   term of an OR-o
2e7e0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e  ptimization usin
2e7f0 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
2e800 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a  Y of a.        *
2e810 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
2e820 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20  table.  No need 
2e830 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69  for a separate i
2e840 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
2e850 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
2e860 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20  el->iTabCur;.   
2e870 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20       op = 0;.   
2e880 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49     }else if( pWI
2e890 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
2e8a0 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
2e8b0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
2e8c0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2e8d0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
2e8e0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
2e8f0 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61  uxArg;.        a
2e900 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
2e910 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2e920 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
2e930 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
2e940 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
2e950 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
2e960 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
2e970 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
2e980 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
2e990 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2e9a0 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
2e9b0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
2e9c0 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
2e9d0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
2e9e0 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20  lse if( iAuxArg 
2e9f0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2ea00 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2ea10 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  USE)!=0 ){.     
2ea20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
2ea30 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
2ea40 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64  op = OP_ReopenId
2ea50 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
2ea60 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2ea70 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2ea80 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
2ea90 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
2eaa0 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
2eab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
2eac0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
2ead0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
2eae0 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
2eaf0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
2eb00 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
2eb10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2eb20 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
2eb30 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
2eb40 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
2eb50 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
2eb60 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
2eb70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ix);.        if(
2eb80 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2eb90 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
2eba0 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20  INT)!=0.        
2ebb0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
2ebc0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
2ebd0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
2ebe0 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20  SKIPSCAN))==0.  
2ebf0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
2ec00 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
2ec10 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
2ec20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2ec30 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2ec40 74 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t!=WHERE_DISTINC
2ec50 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20  T_ORDERED.      
2ec60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
2ec70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ec80 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
2ec90 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f  KEQ); /* Hint to
2eca0 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20   COMDB2 */.     
2ecb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62     }.        Vdb
2ecc0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2ecd0 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
2ece0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2ecf0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2ed00 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b  D_MASK.        {
2ed10 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63  .          u64 c
2ed20 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20  olUsed = 0;.    
2ed30 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a        int ii, jj
2ed40 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2ed50 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43  ii=0; ii<pIx->nC
2ed60 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  olumn; ii++){.  
2ed70 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70            jj = p
2ed80 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d  Ix->aiColumn[ii]
2ed90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2eda0 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75  ( jj<0 ) continu
2edb0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
2edc0 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20  f( jj>63 ) jj = 
2edd0 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  63;.            
2ede0 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63  if( (pTabItem->c
2edf0 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
2ee00 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  (jj))==0 ) conti
2ee10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2ee20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36   colUsed |= ((u6
2ee30 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69  4)1)<<(ii<63 ? i
2ee40 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20  i : 63);.       
2ee50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2ee60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ee70 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
2ee80 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75  nsUsed, iIndexCu
2ee90 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eeb0 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63           (u8*)&c
2eec0 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2eed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
2eee0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
2eef0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2ef00 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  _MASK */.      }
2ef10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2ef20 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43  Db>=0 ) sqlite3C
2ef30 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2ef40 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2ef50 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
2ef60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2ef70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2ef80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ef90 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2efa0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
2efb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
2efc0 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
2efd0 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
2efe0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
2eff0 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
2f000 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
2f010 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
2f020 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
2f030 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
2f040 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
2f050 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
2f060 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ii++){.    int a
2f070 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
2f080 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20  int wsFlags;.   
2f090 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2f0a0 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73  o->a[ii];.    ws
2f0b0 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e  Flags = pLevel->
2f0c0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
2f0d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f0e0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2f0f0 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
2f100 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
2f110 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
2f120 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
2f130 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41        constructA
2f140 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
2f150 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  arse, &pWInfo->s
2f160 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC,.            
2f170 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61      &pTabList->a
2f180 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c  [pLevel->iFrom],
2f190 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
2f1a0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
2f1b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2f1c0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2f1d0 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e  Error;.    }.#en
2f1e0 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c  dif.    addrExpl
2f1f0 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ain = sqlite3Whe
2f200 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  reExplainOneScan
2f210 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
2f220 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
2f230 65 6c 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20  el, wctrlFlags. 
2f240 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c     );.    pLevel
2f250 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
2f260 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f270 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
2f280 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68  eady = sqlite3Wh
2f290 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
2f2a0 61 72 74 28 70 50 61 72 73 65 2c 76 2c 70 57 49  art(pParse,v,pWI
2f2b0 6e 66 6f 2c 69 69 2c 70 4c 65 76 65 6c 2c 6e 6f  nfo,ii,pLevel,no
2f2c0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
2f2d0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2f2e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2f2f0 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c  t;.    if( (wsFl
2f300 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ags&WHERE_MULTI_
2f310 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c  OR)==0 && (wctrl
2f320 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f 53  Flags&WHERE_OR_S
2f330 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a  UBCLAUSE)==0 ){.
2f340 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2f350 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
2f360 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  v, pTabList, pLe
2f370 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e  vel, addrExplain
2f380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2f390 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64  /* Done. */.  Vd
2f3a0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
2f3b0 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
2f3c0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75  -core"));.  retu
2f3d0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
2f3e0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
2f3f0 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
2f400 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
2f410 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
2f420 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
2f430 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
2f440 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
2f450 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
2f460 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2f470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2f480 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f 66  }../*.** Part of
2f490 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2f4a0 28 29 20 77 69 6c 6c 20 72 65 77 72 69 74 65 20  () will rewrite 
2f4b0 6f 70 63 6f 64 65 73 20 74 6f 20 72 65 66 65 72  opcodes to refer
2f4c0 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e 64 65  ence the.** inde
2f4d0 78 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  x rather than th
2f4e0 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 49  e main table.  I
2f4f0 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6d  n SQLITE_DEBUG m
2f500 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a 2a 2a 20  ode, we want.** 
2f510 74 6f 20 74 72 61 63 65 20 74 68 6f 73 65 20 63  to trace those c
2f520 68 61 6e 67 65 73 20 69 66 20 50 52 41 47 4d 41  hanges if PRAGMA
2f530 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65   vdbe_addoptrace
2f540 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  =on.  This routi
2f550 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68 61 74 2e  ne.** does that.
2f560 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2f570 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69 6e  TE_DEBUG.# defin
2f580 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54  e OpcodeRewriteT
2f590 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f 2a 20 6e  race(D,K,P) /* n
2f5a0 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65 0a 23 20  o-op */.#else.# 
2f5b0 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65 77  define OpcodeRew
2f5c0 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50 29  riteTrace(D,K,P)
2f5d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70 63   sqlite3WhereOpc
2f5e0 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
2f5f0 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74 69 63 20  D,K,P).  static 
2f600 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
2f610 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54 72  eOpcodeRewriteTr
2f620 61 63 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33  ace(.    sqlite3
2f630 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74 20 70 63   *db,.    int pc
2f640 2c 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ,.    VdbeOp *pO
2f650 70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 28  p.  ){.    if( (
2f660 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2f670 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
2f680 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
2f690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
2f6a0 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c 20 70 4f  rintOp(0, pc, pO
2f6b0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
2f6c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
2f6d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2f6e0 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
2f6f0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
2f700 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2f710 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
2f720 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2f730 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
2f740 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
2f750 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
2f760 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
2f770 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
2f780 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2f790 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2f7a0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2f7b0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
2f7c0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
2f7d0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2f7e0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2f7f0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2f800 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2f810 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
2f820 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
2f830 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
2f840 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2f850 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
2f860 65 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  e"));.  for(i=pW
2f870 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2f880 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2f890 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
2f8a0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2f8b0 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
2f8c0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2f8d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2f8e0 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
2f8f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f900 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2f910 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20  D_DISTINCT.     
2f920 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d 20   int addrSeek = 
2f930 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  0;.      Index *
2f940 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIdx;.      int 
2f950 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  n;.      if( pWI
2f960 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
2f970 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2f980 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26 26  RDERED.       &&
2f990 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   i==pWInfo->nLev
2f9a0 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b 65 74 20  el-1  /* Ticket 
2f9b0 5b 65 66 39 33 31 38 37 35 37 62 31 35 32 65 33  [ef9318757b152e3
2f9c0 5d 20 32 30 31 37 2d 31 30 2d 32 31 20 2a 2f 0a  ] 2017-10-21 */.
2f9d0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2f9e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f9f0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
2fa00 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d 20       && (pIdx = 
2fa10 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2fa20 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74 31  Index)->hasStat1
2fa30 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d 20  .       && (n = 
2fa40 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2fa50 44 69 73 74 69 6e 63 74 43 6f 6c 29 3e 30 0a 20  DistinctCol)>0. 
2fa60 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 61        && pIdx->a
2fa70 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33  iRowLogEst[n]>=3
2fa80 36 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  6.      ){.     
2fa90 20 20 20 69 6e 74 20 72 31 20 3d 20 70 50 61 72     int r1 = pPar
2faa0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2fab0 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20      int j, op;. 
2fac0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2fad0 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<n; j++){.     
2fae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2faf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2fb00 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  umn, pLevel->iId
2fb10 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a  xCur, j, r1+j);.
2fb20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fb30 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2fb40 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f  = n+1;.        o
2fb50 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  p = pLevel->op==
2fb60 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65 65  OP_Prev ? OP_See
2fb70 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b  kLT : OP_SeekGT;
2fb80 0a 20 20 20 20 20 20 20 20 61 64 64 72 53 65 65  .        addrSee
2fb90 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  k = sqlite3VdbeA
2fba0 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
2fbb0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
2fbc0 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20   0, r1, n);.    
2fbd0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2fbe0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
2fbf0 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64  kLT);.        Vd
2fc00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
2fc10 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a  op==OP_SeekGT);.
2fc20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fc30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2fc40 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  Goto, 1, pLevel-
2fc50 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  >p2);.      }.#e
2fc60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2fc70 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44  ISABLE_SKIPAHEAD
2fc80 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20  _DISTINCT */.   
2fc90 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e     /* The common
2fca0 20 63 61 73 65 3a 20 41 64 76 61 6e 63 65 20 74   case: Advance t
2fcb0 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a  o the next row *
2fcc0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2fcd0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2fce0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
2fcf0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
2fd00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2fd10 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
2fd20 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2fd30 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
2fd40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2fd50 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
2fd60 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
2fd70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2fd80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
2fd90 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
2fda0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
2fdb0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2fdc0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2fdd0 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
2fde0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2fdf0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2fe00 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69  p==OP_VNext);.#i
2fe10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2fe20 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2fe30 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 66  ISTINCT.      if
2fe40 28 20 61 64 64 72 53 65 65 6b 20 29 20 73 71 6c  ( addrSeek ) sql
2fe50 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2fe60 28 76 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a 23  (v, addrSeek);.#
2fe70 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2fe80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fe90 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2fea0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2feb0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
2fec0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2fed0 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
2fee0 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
2fef0 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
2ff00 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
2ff10 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
2ff20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ff30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2ff40 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
2ff50 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
2ff60 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
2ff70 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
2ff80 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
2ff90 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
2ffa0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
2ffb0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2ffc0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
2ffd0 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  op+1);.        i
2ffe0 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  f( pIn->eEndLoop
2fff0 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
30000 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e           if( pIn
30010 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ->nPrefix ){.   
30020 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30030 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
30040 26 20 57 48 45 52 45 5f 49 4e 5f 45 41 52 4c 59  & WHERE_IN_EARLY
30050 4f 55 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  OUT );.         
30060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30070 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 66  dOp4Int(v, OP_If
30080 4e 6f 48 6f 70 65 2c 20 70 4c 65 76 65 6c 2d 3e  NoHope, pLevel->
30090 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20  iIdxCur,.       
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
300c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
300d0 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +2,.            
300e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300f0 20 20 70 49 6e 2d 3e 69 42 61 73 65 2c 20 70 49    pIn->iBase, pI
30100 6e 2d 3e 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  n->nPrefix);.   
30110 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
30120 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
30130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30150 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  2(v, pIn->eEndLo
30160 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  opOp, pIn->iCur,
30170 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
30180 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
30190 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
301a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
301b0 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
301c0 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65  ndLoopOp==OP_Pre
301d0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  v);.          Vd
301e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
301f0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d  pIn->eEndLoopOp=
30200 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20  =OP_Next);.     
30210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
30220 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
30230 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
30240 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
30250 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30260 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30270 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
30280 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
30290 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29  evel->addrSkip )
302a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
302b0 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
302c0 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
302d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
302e0 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73  (v, "next skip-s
302f0 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f  can on %s", pLoo
30300 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
30310 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
30320 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
30330 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d  pHere(v, pLevel-
30340 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
30350 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
30360 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d  pHere(v, pLevel-
30370 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20  >addrSkip-2);.  
30380 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
30390 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
303a0 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69  ATCH_BLOBS.    i
303b0 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
303c0 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
303d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
303e0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
303f0 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76  Zero, (int)(pLev
30400 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
30410 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >>1),.          
30420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
30430 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
30440 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
30450 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
30460 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30470 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
30480 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77  n ){.      int w
30490 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
304a0 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  gs;.      addr =
304b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
304c0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
304d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
304e0 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  n); VdbeCoverage
304f0 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
30500 74 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  t( (ws & WHERE_I
30510 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28  DX_ONLY)==0 || (
30520 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
30530 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
30540 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
30550 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
30560 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30570 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3d  pLevel->iTabCur=
30580 3d 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  =pTabList->a[pLe
30590 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72  vel->iFrom].iCur
305a0 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73  sor );.        s
305b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
305c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
305d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
305e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
305f0 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
30600 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20 20 20  INDEXED) .      
30610 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45 52 45   || ((ws & WHERE
30620 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20 70 4c  _MULTI_OR) && pL
30630 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 29  evel->u.pCovidx)
30640 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
30650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30660 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
30670 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
30680 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
30690 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
306a0 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
306b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
306c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
306d0 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
306e0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
306f0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
30700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
30710 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
30720 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
30730 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
30740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
30750 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
30760 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f      }.    VdbeMo
30770 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
30780 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25  "End WHERE-loop%
30790 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20  d: %s", i,.     
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
307c0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
307d0 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m].pTab->zName))
307e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
307f0 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
30800 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
30810 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30820 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
30830 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
30840 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
30850 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
30860 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61  o->iBreak);..  a
30870 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
30880 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d  Level<=pTabList-
30890 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
308a0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
308b0 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
308c0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
308d0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
308e0 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62  k, last;.    Vdb
308f0 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e  eOp *pOp;.    In
30900 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20  dex *pIdx = 0;. 
30910 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
30920 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
30930 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
30940 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
30950 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
30960 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
30970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
30980 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  ab!=0 );.    pLo
30990 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
309a0 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  oop;..    /* For
309b0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63   a co-routine, c
309c0 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c  hange all OP_Col
309d0 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74  umn references t
309e0 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  o the table of. 
309f0 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75     ** the co-rou
30a00 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70  tine into OP_Cop
30a10 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74  y of result cont
30a20 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73  ained in a regis
30a30 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52  ter..    ** OP_R
30a40 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f  owid becomes OP_
30a50 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Null..    */.   
30a60 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
30a70 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
30a80 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
30a90 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
30aa0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
30ab0 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
30ac0 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65  umnToCopy(pParse
30ad0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f  , pLevel->addrBo
30ae0 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dy, pLevel->iTab
30af0 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b10 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
30b20 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  sult, 0);.      
30b30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
30b40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
30b50 4e 41 42 4c 45 5f 45 41 52 4c 59 5f 43 55 52 53  NABLE_EARLY_CURS
30b60 4f 52 5f 43 4c 4f 53 45 0a 20 20 20 20 2f 2a 20  OR_CLOSE.    /* 
30b70 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
30b80 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
30b90 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
30ba0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
30bb0 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
30bc0 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73  o not close curs
30bd0 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ors that will be
30be0 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20 4f   reused by the O
30bf0 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  R optimization. 
30c00 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 52 5f     ** (WHERE_OR_
30c10 53 55 42 43 4c 41 55 53 45 29 2e 20 20 41 6e 64  SUBCLAUSE).  And
30c20 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68   do not close th
30c30 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63  e OP_OpenWrite c
30c40 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72  ursors.    ** cr
30c50 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e  eated for the ON
30c60 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69  EPASS optimizati
30c70 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
30c80 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
30c90 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
30ca0 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
30cb0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
30cc0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
30cd0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
30ce0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
30cf0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
30d00 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d   int ws = pLoop-
30d10 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
30d20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
30d30 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
30d40 46 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45  F && (ws & WHERE
30d50 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
30d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30d70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30d80 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
30d90 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
30da0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77    }.      if( (w
30db0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
30dc0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
30dd0 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  (ws & (WHERE_IPK
30de0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
30df0 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26  X))==0 .       &
30e00 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  & pLevel->iIdxCu
30e10 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r!=pWInfo->aiCur
30e20 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20  OnePass[1].     
30e30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30e40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
30e50 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
30e60 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
30e70 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
30e80 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
30e90 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
30ea0 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
30eb0 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
30ec0 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
30ed0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
30ee0 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
30ef0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
30f00 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
30f10 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
30f20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
30f30 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
30f40 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
30f50 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
30f60 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
30f70 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
30f80 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
30f90 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
30fa0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
30fb0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
30fc0 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
30fd0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30fe0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
30ff0 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
31000 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
31010 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
31020 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
31030 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
31040 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
31050 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
31060 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
31070 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
31080 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
31090 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
310a0 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
310b0 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
310c0 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
310d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
310e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
310f0 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
31100 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
31110 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
31120 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
31130 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
31140 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
31150 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
31160 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
31170 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
31180 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
31190 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20    if( pIdx.     
311a0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  && (pWInfo->eOne
311b0 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
311c0 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  F || !HasRowid(p
311d0 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20  Idx->pTable)).  
311e0 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f     && !db->mallo
311f0 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20  cFailed.    ){. 
31200 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
31210 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
31220 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d  dr(v);.      k =
31230 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
31240 79 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  y;.#ifdef SQLITE
31250 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
31260 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
31270 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
31280 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  ce ){.        pr
31290 69 6e 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20  intf("TRANSLATE 
312a0 6f 70 63 6f 64 65 73 20 69 6e 20 72 61 6e 67 65  opcodes in range
312b0 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 6b 2c 20 6c   %d..%d\n", k, l
312c0 61 73 74 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ast-1);.      }.
312d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4f 70  #endif.      pOp
312e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
312f0 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20  tOp(v, k);.     
31300 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b   for(; k<last; k
31310 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
31320 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
31330 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
31340 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
31350 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
31360 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a  code==OP_Column.
31370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
31380 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
31390 46 55 4e 43 0a 20 20 20 20 20 20 20 20 20 7c 7c  FUNC.         ||
313a0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
313b0 5f 4f 66 66 73 65 74 0a 23 65 6e 64 69 66 0a 20  _Offset.#endif. 
313c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
313d0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d      int x = pOp-
313e0 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61  >p2;.          a
313f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61  ssert( pIdx->pTa
31400 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
31410 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
31420 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
31430 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
31440 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
31450 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
31460 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
31470 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
31480 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[x];.         
31490 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20     assert( x>=0 
314a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
314b0 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
314c0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
314d0 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20  x(pIdx, x);.    
314e0 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29        if( x>=0 )
314f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
31500 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20  p->p2 = x;.     
31510 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
31520 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
31530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 70  ;.            Op
31540 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
31550 28 64 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20  (db, k, pOp);.  
31560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31570 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
31580 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
31590 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
315a0 20 7c 7c 20 78 3e 3d 30 20 0a 20 20 20 20 20 20   || x>=0 .      
315b0 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66          || pWInf
315c0 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 29 3b 0a 20  o->eOnePass );. 
315d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
315e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
315f0 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
31600 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
31610 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
31620 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
31630 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
31640 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 70  id;.          Op
31650 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
31660 28 64 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20  (db, k, pOp);.  
31670 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31680 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
31690 49 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  IfNullRow ){.   
316a0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
316b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
316c0 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f  ;.          Opco
316d0 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28 64  deRewriteTrace(d
316e0 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20  b, k, pOp);.    
316f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
31700 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
31710 47 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  G.      if( db->
31720 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
31730 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 20  dbeAddopTrace ) 
31740 70 72 69 6e 74 66 28 22 54 52 41 4e 53 4c 41 54  printf("TRANSLAT
31750 45 20 63 6f 6d 70 6c 65 74 65 5c 6e 22 29 3b 0a  E complete\n");.
31760 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
31770 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
31780 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
31790 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
317a0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
317b0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
317c0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
317d0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
317e0 0a 7d 0a                                         .}.