/ Hex Artifact Content
Login

Artifact 5192013a21843523f4772087a56e59db73bd4c7401349968120dc0693b7c4eb4:


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: 69 66 28 20 70 49 6e 6e 65 72 2d 3e 61 64 64 72  if( pInner->addr
0eb0: 4e 78 74 20 29 20 72 65 74 75 72 6e 20 70 49 6e  Nxt ) return pIn
0ec0: 6e 65 72 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  ner->addrNxt;.  
0ed0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ee0: 64 64 72 42 72 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrBrk;.}../*.**
0ef0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0f00: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f10: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f20: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f30: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f40: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f50: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f60: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f70: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f80: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f90: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0fa0: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fb0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fc0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fd0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fe0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0ff0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
1000: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1010: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1020: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1030: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1040: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1050: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1060: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1070: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1080: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1090: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
10a0: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10b0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10c0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10d0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10e0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10f0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
1100: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1110: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1120: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1130: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1140: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1150: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1160: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1170: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1180: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1190: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
11a0: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11c0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11d0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11e0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11f0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
1200: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1210: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1220: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1230: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1240: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1250: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1260: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1270: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1280: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1290: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
12a0: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12b0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12c0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12d0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12e0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12f0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
1300: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1310: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1320: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1330: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1340: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1350: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1360: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1370: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1380: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1390: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
13a0: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13b0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13e0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13f0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
1400: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1410: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1420: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1430: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1440: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1450: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1460: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1470: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1480: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1490: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
14a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14b0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14c0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14d0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14e0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14f0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
1500: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1510: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1520: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1530: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1540: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1550: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1560: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1570: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1580: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1590: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
15a0: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15b0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15c0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15d0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15e0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15f0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
1600: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1610: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1620: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1630: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1640: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1650: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1660: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1670: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1680: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1690: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
16a0: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16b0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16c0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16d0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16e0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16f0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
1700: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1710: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1720: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1730: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1740: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1750: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1760: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1770: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1780: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1790: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
17a0: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17b0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17c0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17d0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17e0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17f0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
1800: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1820: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1830: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1840: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1850: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1860: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1870: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1880: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1890: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
18a0: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18b0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18c0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18d0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18e0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18f0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1900: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1910: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1920: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1940: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1950: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1960: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1970: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1980: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
19a0: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19b0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19d0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19e0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19f0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
1a00: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a10: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a20: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a30: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a40: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a50: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a60: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a70: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a80: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a90: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1aa0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1ab0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ac0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ad0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ae0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1af0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1b00: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b10: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b20: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b30: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b40: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b50: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b60: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b70: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b80: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b90: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1ba0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1bb0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bc0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bd0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1be0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1bf0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1c00: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c10: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c20: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c30: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c40: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c50: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c60: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c80: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c90: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1ca0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1cb0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cc0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cd0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1ce0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1cf0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1d00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d10: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d20: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d30: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d50: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d60: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d70: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d80: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d90: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1da0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1db0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1dc0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dd0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1de0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1df0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1e00: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e10: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e20: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e30: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e40: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e50: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e60: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e70: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e80: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e90: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1ea0: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ec0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ed0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ee0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ef0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1f00: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f10: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f20: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f30: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f40: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f50: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f60: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f70: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f80: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f90: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1fa0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fb0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fc0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fd0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fe0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1ff0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
2000: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2010: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2020: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2030: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2040: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2050: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2060: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2070: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2080: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2090: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
20a0: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20b0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20c0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20d0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20e0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20f0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
2100: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2110: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2120: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2130: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2140: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2150: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2160: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2170: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2180: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2190: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
21a0: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21d0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21e0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21f0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
2200: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2210: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2220: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2230: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2240: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2250: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2260: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2270: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2280: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2290: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
22a0: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22b0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22c0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
22d0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
22e0: 67 68 74 29 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ght))->op==TK_CO
22f0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 29  LUMN.          )
2300: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2310: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
2320: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61   for(j=0; j<pSca
2330: 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 2b 29 7b  n->nEquiv; j++){
2340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2350: 66 28 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  f( pScan->aiCur[
2360: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2380: 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e   pScan->aiColumn
2390: 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  [j]==pX->iColumn
23a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23e0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
23f0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
2410: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 20 3d 20 70  an->aiCur[j] = p
2420: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
2430: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2440: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58  aiColumn[j] = pX
2450: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2460: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2470: 6e 45 71 75 69 76 2b 2b 3b 0a 20 20 20 20 20 20  nEquiv++;.      
2480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2490: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
24a0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
24b0: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
24c0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
24d0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
24e0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
24f0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
2500: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
2510: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2520: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
2530: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
2540: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
2550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2560: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2570: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2580: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
2590: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
25a0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
25b0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
25c0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
25d0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
25e0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
25f0: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
2600: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
2610: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2620: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2630: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2640: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
2650: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2660: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2670: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2680: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20  llSeq(pParse,.  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
26d0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
26e0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
26f0: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  =0 ) pColl = pPa
2700: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2710: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2720: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2730: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2740: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
2750: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
2760: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2770: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2780: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2790: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27a0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27b0: 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
27c0: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
27d0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
27e0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
27f0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
2800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2810: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
2820: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 0a 20 20 20  an->aiCur[0].   
2830: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
2840: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
2850: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20  >aiColumn[0].   
2860: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2870: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2880: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
2890: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28d0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
28e0: 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC;.            
28f0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a  pScan->k = k+1;.
2900: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2910: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
2920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
2940: 43 20 3d 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b  C = pWC->pOuter;
2950: 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  .      k = 0;.  
2960: 20 20 7d 77 68 69 6c 65 28 20 70 57 43 21 3d 30    }while( pWC!=0
2970: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 61   );.    if( pSca
2980: 6e 2d 3e 69 45 71 75 69 76 3e 3d 70 53 63 61 6e  n->iEquiv>=pScan
2990: 2d 3e 6e 45 71 75 69 76 20 29 20 62 72 65 61 6b  ->nEquiv ) break
29a0: 3b 0a 20 20 20 20 70 57 43 20 3d 20 70 53 63 61  ;.    pWC = pSca
29b0: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
29c0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
29d0: 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20 7d 0a  ->iEquiv++;.  }.
29e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29f0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2a00: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
2a10: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
2a20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2a30: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
2a40: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
2a50: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
2a60: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
2a70: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
2a80: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
2a90: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
2aa0: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
2ab0: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
2ac0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
2ad0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
2ae0: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
2af0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
2b00: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 20 4f 72 20  e.** iCur.   Or 
2b10: 69 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20  if pIdx!=0 then 
2b20: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
2b30: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
2b40: 78 2e 20 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74  x.  pIdx.** must
2b50: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
2b60: 6e 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20  ndexes of table 
2b70: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2b80: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
2b90: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
2ba0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
2bb0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
2bc0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
2bd0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
2be0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
2bf0: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
2c00: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
2c10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2c20: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
2c30: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2c40: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
2c50: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
2c60: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
2c70: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
2c80: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
2c90: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
2ca0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
2cb0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
2cc0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
2cd0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
2ce0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2cf0: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
2d00: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2d10: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
2d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
2d30: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
2d40: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
2d50: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
2d60: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
2d70: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
2d80: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
2d90: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2da0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2db0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2dc0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
2dd0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2de0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2df0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2e00: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e20: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
2e30: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e50: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
2e60: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
2e70: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2e80: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2e90: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2ea0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
2eb0: 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43    pScan->pOrigWC
2ec0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2ed0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  >pWC = pWC;.  pS
2ee0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20  can->pIdxExpr = 
2ef0: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  0;.  pScan->idxa
2f00: 66 66 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d  ff = 0;.  pScan-
2f10: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a  >zCollName = 0;.
2f20: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2f30: 20 20 69 6e 74 20 6a 20 3d 20 69 43 6f 6c 75 6d    int j = iColum
2f40: 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  n;.    iColumn =
2f50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2f60: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  j];.    if( iCol
2f70: 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  umn==XN_EXPR ){.
2f80: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64        pScan->pId
2f90: 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43  xExpr = pIdx->aC
2fa0: 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
2fb0: 70 72 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d  pr;.      pScan-
2fc0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
2fd0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
2fe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
2ff0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
3000: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
3010: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52    iColumn = XN_R
3020: 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  OWID;.    }else 
3030: 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
3040: 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 69  {.      pScan->i
3050: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3060: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3070: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3080: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
3090: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
30a0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  oll[j];.    }.  
30b0: 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d  }else if( iColum
30c0: 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  n==XN_EXPR ){.  
30d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
30e0: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
30f0: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
3100: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
3110: 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69 43  n->aiCur[0] = iC
3120: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43  ur;.  pScan->aiC
3130: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75  olumn[0] = iColu
3140: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
3150: 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e  uiv = 1;.  pScan
3160: 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20 20  ->iEquiv = 1;.  
3170: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
3180: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
3190: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
31a0: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
31b0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
31c0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
31d0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
31e0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
31f0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
3200: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
3210: 65 20 69 43 75 72 20 6f 72 20 6f 66 20 69 6e 64  e iCur or of ind
3220: 65 78 20 70 49 64 78 0a 2a 2a 20 69 66 20 70 49  ex pIdx.** if pI
3230: 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69  dx!=0 and <op> i
3240: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f  s one of the WO_
3250: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3260: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 2a  s specified by.*
3270: 2a 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  * the op paramet
3280: 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  er.  Return a po
3290: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
32a0: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
32b0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
32c0: 20 49 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e   If pIdx!=0 then
32d0: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   it must be one 
32e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f  of the indexes o
32f0: 66 20 74 61 62 6c 65 20 69 43 75 72 2e 20 20 0a  f table iCur.  .
3300: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 65  ** Search for te
3310: 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74 68 65  rms matching the
3320: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
3330: 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61  mn of pIdx.** ra
3340: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 43  ther than the iC
3350: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3360: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a  of table iCur..*
3370: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
3380: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
3390: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
33a0: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
33b0: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
33c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
33d0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
33e0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
33f0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
3400: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
3410: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
3420: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
3430: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3440: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
3450: 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b  iCur[]/iaColumn[
3460: 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20 58 20  ] arrays hold X 
3470: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
3480: 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65 20 61  valents. There a
3490: 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69  re 11.** slots i
34a0: 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75  n aiCur[]/aiColu
34b0: 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d 65 61  mn[] so that mea
34c0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
34d0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
34e0: 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71 75 69  10.** other equi
34f0: 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 20 20  valent values.  
3500: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
3510: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
3520: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 0a   <expr> if X=A1.
3530: 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  ** and A1=A2 and
3540: 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61   A2=A3 and ... a
3550: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
3560: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
3570: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
3580: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
3590: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
35a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
35b0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
35c0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
35d0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
35e0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
35f0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
3600: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
3610: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
3620: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
3630: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
3640: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
3650: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
3660: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
3670: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
3680: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
3690: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
36a0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
36b0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
36c0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
36d0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
36e0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
36f0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
3700: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
3710: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
3720: 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  IV..*/.WhereTerm
3730: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46 69   *sqlite3WhereFi
3740: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3750: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3760: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3770: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3780: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3790: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
37a0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37b0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37c0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
37d0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
37e0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
37f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
3800: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3810: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3820: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3830: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
3840: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3850: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3860: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
3870: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
3880: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
3890: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
38a0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38b0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38c0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
38d0: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
38e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
38f0: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
3900: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
3910: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
3920: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
3930: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f  , op, pIdx);.  o
3940: 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  p &= WO_EQ|WO_IS
3950: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
3960: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
3970: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3980: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
3990: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
39a0: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
39b0: 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b  erator&op)!=0 ){
39c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
39d0: 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20  e( p->eOperator 
39e0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
39f0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
3a00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3a10: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
3a20: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
3a30: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
3a40: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
3a50: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
3a60: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
3a70: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
3a80: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20  es pList for an 
3a90: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
3aa0: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
3ab0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
3ac0: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
3ad0: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
3ae0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
3af0: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
3b00: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
3b10: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
3b20: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
3b30: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
3b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3b50: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
3b60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b80: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3b90: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3ba0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
3bb0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3bc0: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
3bd0: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
3be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3bf0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3c00: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
3c10: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
3c20: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c40: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3c50: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
3c60: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3c90: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
3ca0: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
3cb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3cc0: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
3cd0: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
3ce0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
3cf0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
3d00: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3d10: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3d20: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
3d30: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3d40: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
3d50: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
3d60: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
3d70: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
3d80: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
3d90: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
3da0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
3db0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
3dc0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3dd0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3de0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
3df0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3e00: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
3e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3e20: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
3e30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3e40: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
3e50: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
3e60: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
3e70: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69   of index pIdx i
3e80: 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  s NOT NULL.*/.st
3e90: 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f  atic int indexCo
3ea0: 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  lumnNotNull(Inde
3eb0: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
3ec0: 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  l){.  int j;.  a
3ed0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
3ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
3ef0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78  >=0 && iCol<pIdx
3f00: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a  ->nColumn );.  j
3f10: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
3f20: 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a  n[iCol];.  if( j
3f30: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
3f40: 6e 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  n pIdx->pTable->
3f50: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[j].notNull;
3f60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d  .  }else if( j==
3f70: 28 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (-1) ){.    retu
3f80: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
3f90: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d     assert( j==(-
3fa0: 32 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  2) );.    return
3fb0: 20 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61   0;  /* Assume a
3fc0: 6e 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  n indexed expres
3fd0: 73 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20  sion can always 
3fe0: 79 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a  yield a NULL */.
3ff0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4000: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
4010: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
4020: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
4030: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
4040: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
4050: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
4060: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
4070: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e   redundant if an
4080: 79 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  y subset of the 
4090: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a  columns in the.*
40a0: 2a 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  * DISTINCT list 
40b0: 61 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79  are collectively
40c0: 20 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69   unique and indi
40d0: 76 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c  vidually non-nul
40e0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
40f0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
4100: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
4110: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4120: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
4130: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
4140: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
4150: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
4160: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4170: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
4190: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
41a0: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
41b0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
41c0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
41d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
41e0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
41f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
4200: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
4210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4220: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
4230: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
4240: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
4250: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
4260: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
4270: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4280: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
4290: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
42a0: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
42b0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
42c0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
42d0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
42e0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
42f0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
4300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4310: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
4320: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
4330: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
4340: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
4350: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
4360: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
4370: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
4380: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
4390: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
43a0: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
43b0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
43c0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
43d0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
43e0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
43f0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
4400: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
4410: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
4420: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
4430: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
4440: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
4450: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
4460: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
4470: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
4480: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
4490: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
44a0: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
44b0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
44c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
44d0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
44e0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
44f0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
4500: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
4510: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
4520: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4530: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
4540: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
4550: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
4560: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
4570: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
4580: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
4590: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
45a0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
45b0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
45c0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
45d0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
45e0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
45f0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
4600: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
4610: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
4620: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
4630: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
4640: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
4650: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
4660: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
4670: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
4680: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
4690: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
46a0: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
46b0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
46c0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
46d0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
46e0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
46f0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
4700: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
4710: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
4720: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
4730: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
4740: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
4750: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4760: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4770: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4780: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
4790: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
47a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
47b0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
47c0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
47d0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
47e0: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
47f0: 43 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42  C, iBase, i, ~(B
4800: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
4810: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
4820: 20 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43    if( findIndexC
4830: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
4840: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
4850: 78 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b  x, i)<0 ) break;
4860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64  .        if( ind
4870: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
4880: 70 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72  pIdx, i)==0 ) br
4890: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
48a0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
48b0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
48c0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
48d0: 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
48e0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
48f0: 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
4900: 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
4910: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4920: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
4930: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  .../*.** Estimat
4940: 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
4950: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
4960: 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
4970: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65  .static LogEst e
4980: 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b  stLog(LogEst N){
4990: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20  .  return N<=10 
49a0: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67  ? 0 : sqlite3Log
49b0: 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a  Est(N) - 33;.}..
49c0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50  /*.** Convert OP
49d0: 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20  _Column opcodes 
49e0: 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72  to OP_Copy in pr
49f0: 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
4a00: 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed code..**.** T
4a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
4a20: 20 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20   over generated 
4a30: 56 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72  VDBE code and tr
4a40: 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75  anslates OP_Colu
4a50: 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e  mn.** opcodes in
4a60: 74 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20  to OP_Copy when 
4a70: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
4a80: 6e 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20  ng accessed via 
4a90: 63 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69  co-routine .** i
4aa0: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61  nstead of via ta
4ab0: 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a  ble lookup..**.*
4ac0: 2a 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f  * If the bIncrRo
4ad0: 77 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  wid parameter is
4ae0: 20 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f   0, then any OP_
4af0: 52 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f  Rowid instructio
4b00: 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20  ns on.** cursor 
4b10: 69 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e  iTabCur are tran
4b20: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f  sformed into OP_
4b30: 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e  Null. Or, if bIn
4b40: 63 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  crRowid is non-z
4b50: 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63  ero,.** then eac
4b60: 68 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72  h OP_Rowid is tr
4b70: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61  ansformed into a
4b80: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
4b90: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a   increment the.*
4ba0: 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  * value stored i
4bb0: 6e 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67  n its output reg
4bc0: 69 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ister..*/.static
4bd0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43   void translateC
4be0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50  olumnToCopy(.  P
4bf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4c00: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4c10: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
4c20: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4c30: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4c40: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4c50: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4c60: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4c70: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4c80: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4c90: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4ca0: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4cb0: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4cc0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
4cd0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
4ce0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
4cf0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
4d00: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
4d10: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
4d20: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4d30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4d40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4d50: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71  VdbeOp *pOp = sq
4d60: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
4d70: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74  , iStart);.  int
4d80: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
4d90: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4da0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
4db0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4dc0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  d ) return;.  fo
4dd0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
4de0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
4df0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
4e00: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4e10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4e20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4e30: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4e40: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4e50: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4e60: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4e70: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4e80: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4e90: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4ea0: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
4eb0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
4ec0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
4ed0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
4ee0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
4ef0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
4f00: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4f10: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4f20: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4f30: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4f40: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4f50: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4f60: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4f70: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4f80: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4f90: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4fa0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
4fb0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
4fc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
4fd0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
4fe0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4ff0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
5000: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
5010: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
5020: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5030: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
5040: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
5050: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
5060: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
5070: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
5080: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
5090: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
50a0: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
50b0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
50c0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
50d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
50e0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
50f0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
5100: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
5110: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
5120: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
5130: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5140: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5150: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5160: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5170: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5180: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5190: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
51a0: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
51b0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
51c0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
51d0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
51e0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
51f0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
5200: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5210: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
5220: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
5230: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
5240: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
5250: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5260: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
5270: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
5280: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
5290: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
52a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
52b0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
52c0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
52d0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
52e0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
52f0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
5300: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
5310: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
5320: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
5330: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
5340: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5350: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5360: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5370: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5380: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5390: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
53a0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
53b0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
53c0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
53d0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
53e0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
53f0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
5400: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
5410: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5420: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
5430: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
5440: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
5450: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
5460: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
5470: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5480: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
5490: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
54a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
54b0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
54c0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
54d0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
54e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
54f0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5500: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
5510: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
5520: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5530: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5540: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
5550: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
5560: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
5570: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
5580: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
5590: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
55a0: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
55b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55c0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
55e0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
55f0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
5600: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
5610: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
5620: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
5630: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
5640: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
5650: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
5660: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
5670: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
5680: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
5690: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
56a0: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
56b0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
56c0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
56d0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
56e0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
56f0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
5700: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
5710: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
5720: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
5730: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5740: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
5750: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
5760: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5770: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5780: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
5790: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
57a0: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
57b0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
57c0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
57d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
57e0: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
57f0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20  pe & JT_LEFT) . 
5800: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5810: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
5820: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5830: 0a 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  .   && (pTerm->e
5840: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
5850: 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ).  ){.    /* Ca
5860: 6e 6e 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74  nnot use an IS t
5870: 65 72 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45  erm from the WHE
5880: 52 45 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20  RE clause as an 
5890: 69 6e 64 65 78 20 64 72 69 76 65 72 20 66 6f 72  index driver for
58a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
58b0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
58c0: 53 75 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20  Such a term can 
58d0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
58e0: 69 74 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a  it is from.    *
58f0: 2a 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  * the ON clause.
5900: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
5910: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54  0;.  }.  if( (pT
5920: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5930: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
5940: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5950: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
5960: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
5970: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
5980: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
5990: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
59a0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
59b0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
59c0: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
59d0: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
59e0: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
59f0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
5a00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
5a10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5a20: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
5a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
5a40: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
5a50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5a60: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
5a70: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
5a80: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
5a90: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
5aa0: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
5ab0: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
5ac0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
5ad0: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
5ae0: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
5af0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b10: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
5b20: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
5b30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5b50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b60: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
5b70: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
5b80: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5b90: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
5ba0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
5bb0: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
5bc0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5bd0: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
5be0: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
5bf0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
5c00: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
5c10: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5c20: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
5c30: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
5c40: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
5c50: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
5c60: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
5c70: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
5c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5c90: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5ca0: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
5cb0: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
5cc0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
5cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5ce0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
5cf0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5d00: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
5d10: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
5d20: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
5d30: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
5d40: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5d50: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
5d60: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
5d70: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
5d80: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5da0: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
5db0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
5dc0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5dd0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
5de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5df0: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
5e00: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
5e10: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
5e20: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
5e30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e40: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
5e50: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
5e60: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5e70: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5e80: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
5e90: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
5ea0: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
5eb0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5ec0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
5ed0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5f00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5f10: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5f30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5f40: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
5f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
5f60: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
5f70: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
5f80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5fa0: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
5fb0: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
5fc0: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
5fd0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
5fe0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
5ff0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
6000: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
6010: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
6020: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
6030: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
6040: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
6050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6060: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
6070: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
6080: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
6090: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
60a0: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
60b0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
60c0: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
60d0: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
60e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
60f0: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
6100: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
6110: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
6120: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
6130: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
6140: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
6150: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
6160: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6170: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
6180: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  luded rows */.  
6190: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
61a0: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
61b0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
61c0: 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65  erm being indexe
61d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  d */.  int addrC
61e0: 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20  ounter = 0;     
61f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68     /* Address wh
6200: 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e  ere integer coun
6210: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
6220: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  ed */.  int regB
6230: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
6240: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6250: 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20  registers where 
6260: 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62  record is assemb
6270: 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  led */..  /* Gen
6280: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
6290: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
62a0: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
62b0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
62c0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
62d0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
62e0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
62f0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
6300: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
6310: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6320: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
6330: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
6340: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6350: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
6360: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
6370: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6380: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
6390: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
63a0: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
63b0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
63c0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
63d0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
63e0: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
63f0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
6400: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
6410: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
6420: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
6430: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
6440: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
6450: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
6460: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
6470: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
6480: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
6490: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
64a0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
64b0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
64c0: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
64d0: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
64e0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
64f0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
6500: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
6510: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
6520: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
6530: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
6540: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
6550: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6570: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
6580: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
6590: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
65a0: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
65b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
65c0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
65d0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
65e0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
65f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
6600: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
6610: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
6620: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
6630: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
6640: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
6650: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6660: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6690: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
66a0: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
66b0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
66c0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
66d0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
66e0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
66f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6700: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6710: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6720: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6730: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6740: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6750: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6760: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6770: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
6780: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6790: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
67a0: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
67b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
67c0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
67d0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
67e0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
67f0: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
6800: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6810: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6820: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
6830: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
6840: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
6850: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6860: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
6870: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
6880: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6890: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
68a0: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
68b0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
68c0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
68d0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
68e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68f0: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
6900: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6910: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6920: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6940: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6950: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6960: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6970: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6980: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6990: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
69a0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
69b0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
69c0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
69f0: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
6a00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6a10: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6a20: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6a30: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6a40: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6a50: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6a60: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6a70: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6a80: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6a90: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6aa0: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6ab0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6ac0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6ad0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6ae0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6af0: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6b00: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6b10: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6b20: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6b30: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6b40: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6b50: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6b60: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6b70: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6b80: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6b90: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6ba0: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6bb0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6bc0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6bd0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6be0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6bf0: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6c00: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6c10: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6c20: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6c30: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6c40: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6c50: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6c60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6c70: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6c80: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6c90: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6ca0: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6cb0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6cc0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6cd0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6ce0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6cf0: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6d00: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6d10: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6d20: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6d30: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6d40: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6d50: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6d60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6d70: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6d80: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6d90: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6da0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6db0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6dc0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6dd0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6de0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6df0: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6e00: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6e10: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6e20: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6e30: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6e40: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6e50: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6e60: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6e70: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6e80: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
6e90: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6ea0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
6eb0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
6ec0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
6ed0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
6ee0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
6ef0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6f00: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
6f10: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6f20: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
6f30: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
6f40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f50: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
6f60: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6f70: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6f80: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
6f90: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
6fa0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6fb0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
6fc0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
6fd0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
6fe0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6ff0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
7000: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
7010: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
7020: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7030: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7040: 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  Y;.        n++;.
7050: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7060: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
7070: 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
7080: 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
7090: 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
70a0: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
70b0: 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
70c0: 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
70d0: 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
70e0: 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
70f0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
7100: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
7110: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
7120: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
7130: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
7140: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
7150: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69  azColl[n] = sqli
7160: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
7170: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
7180: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
7190: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
71a0: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
71b0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
71c0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
71d0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
71e0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
71f0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
7200: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
7210: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e  rBINARY;.      n
7220: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
7230: 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43  assert( n==nKeyC
7240: 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  ol );.  pIdx->ai
7250: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52  Column[n] = XN_R
7260: 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  OWID;.  pIdx->az
7270: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7280: 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f  3StrBINARY;..  /
7290: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
72a0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
72b0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
72c0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
72d0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
72e0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
72f0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
7300: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7310: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
7320: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
7330: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
7340: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
7350: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
7360: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
7370: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
7380: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
7390: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
73a0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
73b0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
73c0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
73d0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
73e0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
73f0: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
7400: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
7410: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
7420: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
7430: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
7440: 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72  .    addrCounter
7450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7460: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7470: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
7480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7490: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
74a0: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
74b0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
74c0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
74d0: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
74e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
74f0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
7500: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
7510: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7520: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7530: 78 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70  xt row of %s", p
7540: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
7550: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
7560: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
7570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7580: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
7590: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
75a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
75b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
75c0: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
75d0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
75e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
75f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7600: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7610: 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69  pPartial, iConti
7620: 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  nue, SQLITE_JUMP
7630: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f  IFNULL);.    pLo
7640: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
7650: 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 3b  HERE_PARTIALIDX;
7660: 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72 64  .  }.  regRecord
7670: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7680: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7690: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
76a0: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
76b0: 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2c  y(.      pParse,
76c0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
76d0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
76e0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20  d, 0, 0, 0, 0.  
76f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7710: 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
7720: 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
7730: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
7740: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7750: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
7760: 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72 74  LT);.  if( pPart
7770: 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ial ) sqlite3Vdb
7780: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7790: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69   iContinue);.  i
77a0: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
77b0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
77c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77d0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 43  hangeP2(v, addrC
77e0: 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65 2b  ounter, regBase+
77f0: 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  n);.    testcase
7800: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
7810: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7820: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
7830: 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20  nToCopy(pParse, 
7840: 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d  addrTop, pLevel-
7850: 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65      pTabItem->re
7880: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
7890: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
78a0: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
78b0: 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76    pTabItem->fg.v
78c0: 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b  iaCoroutine = 0;
78d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
78e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
78f0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
7900: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
7910: 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rTop+1); VdbeCov
7920: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7930: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7940: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
7950: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
7960: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
7970: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7980: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
7990: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
79a0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
79b0: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
79c0: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
79d0: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
79e0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
79f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7a00: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
7a10: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
7a20: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
7a30: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7a40: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
7a50: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7a60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
7a70: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
7a80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7a90: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
7aa0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
7ab0: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
7ac0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7ad0: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
7ae0: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
7af0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
7b00: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
7b10: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
7b20: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
7b30: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
7b40: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
7b50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
7b60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
7b70: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
7b80: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
7b90: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
7ba0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7bb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7bc0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
7bd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7be0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7bf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c00: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7c10: 75 73 65 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  use being analyz
7c20: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
7c30: 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20  mUnusable,      
7c40: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
7c50: 65 20 74 65 72 6d 73 20 77 69 74 68 20 74 68 65  e terms with the
7c60: 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20  se prereqs */.  
7c70: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7c80: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
7c90: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7ca0: 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
7cb0: 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 45 78  the vtab */.  Ex
7cc0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7ce0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
7cf0: 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 2a 70  ause */.  u16 *p
7d00: 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20  mNoOmit         
7d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
7d20: 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74  k of terms not t
7d30: 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  o omit */.){.  i
7d40: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
7d50: 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
7d60: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7d70: 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
7d80: 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
7d90: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7da0: 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
7db0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7dc0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7dd0: 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
7de0: 0a 20 20 73 74 72 75 63 74 20 48 69 64 64 65 6e  .  struct Hidden
7df0: 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64  IndexInfo *pHidd
7e00: 65 6e 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  en;.  WhereTerm 
7e10: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
7e20: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
7e30: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
7e40: 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e  dxInfo;.  u16 mN
7e50: 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oOmit = 0;..  /*
7e60: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
7e70: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
7e80: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
7e90: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
7ea0: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
7eb0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
7ec0: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
7ed0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7ee0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7ef0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
7f00: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7f10: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7f20: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7f30: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7f40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7f50: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7f60: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7f70: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7f80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7f90: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7fa0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7fb0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7fc0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7fd0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7fe0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
7ff0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
8000: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
8010: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
8020: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8030: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8040: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
8050: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8060: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55  rator & ~(WO_EQU
8070: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
8080: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
8090: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
80a0: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
80b0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
80c0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
80d0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
80e0: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
80f0: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
8100: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
8110: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
8120: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
8130: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
8140: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
8150: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
8160: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
8170: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
8180: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
8190: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
81a0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
81b0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
81c0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
81d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
81e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
81f0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
8200: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
8210: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
8220: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
8230: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
8240: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
8250: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
8260: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8270: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
8280: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
8290: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
82a0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
82b0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
82c0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
82d0: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
82e0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
82f0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
8300: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
8330: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
8340: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
8350: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
8380: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
8390: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 69 64 64   + sizeof(*pHidd
83a0: 65 6e 29 20 29 3b 0a 20 20 69 66 28 20 70 49 64  en) );.  if( pId
83b0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
83c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
83d0: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
83e0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
83f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
8400: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8410: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8420: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8430: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
8440: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
8450: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
8460: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
8470: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
8480: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
8490: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
84a0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
84b0: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
84c0: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
84d0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
84e0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
84f0: 2f 0a 20 20 70 48 69 64 64 65 6e 20 3d 20 28 73  /.  pHidden = (s
8500: 74 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65  truct HiddenInde
8510: 78 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f  xInfo*)&pIdxInfo
8520: 5b 31 5d 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  [1];.  pIdxCons 
8530: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
8540: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8550: 6e 74 2a 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b  nt*)&pHidden[1];
8560: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
8570: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
8580: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
8590: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
85a0: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
85b0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
85c0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
85d0: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
85e0: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
85f0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
8600: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
8610: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
8620: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
8630: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
8640: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8650: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8660: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
8670: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
8680: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
8690: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
86a0: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
86b0: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
86c0: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
86d0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
86e0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
86f0: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
8700: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8710: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
8760: 65 3b 0a 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70  e;..  pHidden->p
8770: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 48 69 64  WC = pWC;.  pHid
8780: 64 65 6e 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  den->pParse = pP
8790: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  arse;.  for(i=j=
87a0: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
87b0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
87c0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
87d0: 20 20 75 31 36 20 6f 70 3b 0a 20 20 20 20 69 66    u16 op;.    if
87e0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
87f0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
8800: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
8810: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8820: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
8830: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
8840: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8850: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
8860: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8870: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
8880: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8890: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
88a0: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
88b0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
88c0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
88d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
88e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
88f0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
8900: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8910: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8920: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
8930: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8940: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49  ator & ~(WO_EQUI
8950: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
8960: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
8970: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8980: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
8990: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
89a0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
89b0: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
89c0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
89d0: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
89e0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
89f0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
8a00: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
8a10: 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  op = pTerm->eOpe
8a20: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
8a30: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8a40: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8a50: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 41      if( op==WO_A
8a60: 55 58 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  UX ){.      pIdx
8a70: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65  Cons[j].op = pTe
8a80: 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20  rm->eMatchOp;.  
8a90: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 20 26    }else if( op &
8aa0: 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
8ab0: 53 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  S) ){.      if( 
8ac0: 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  op==WO_ISNULL ){
8ad0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
8ae0: 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45  s[j].op = SQLITE
8af0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8b00: 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  T_ISNULL;.      
8b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
8b20: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8b30: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8b40: 53 54 52 41 49 4e 54 5f 49 53 3b 0a 20 20 20 20  STRAINT_IS;.    
8b50: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8b60: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
8b70: 2e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  .op = (u8)op;.  
8b80: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
8b90: 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
8ba0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
8bb0: 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
8bc0: 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ly because.     
8bd0: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
8be0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8bf0: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
8c00: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
8c10: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
8c20: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
8c30: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
8c40: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
8c50: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
8c60: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8c70: 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EQ );.      asse
8c80: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
8c90: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8ca0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_LT );.      a
8cb0: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
8cc0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8cd0: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
8ce0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
8cf0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8d00: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
8d10: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
8d20: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
8d30: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
8d40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8d50: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8d60: 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f  &(WO_IN|WO_EQ|WO
8d70: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
8d80: 57 4f 5f 47 45 7c 57 4f 5f 41 55 58 29 20 29 3b  WO_GE|WO_AUX) );
8d90: 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 26  ..      if( op &
8da0: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f   (WO_LT|WO_LE|WO
8db0: 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20  _GT|WO_GE).     
8dc0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
8dd0: 49 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e  IsVector(pTerm->
8de0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a  pExpr->pRight) .
8df0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
8e00: 20 69 66 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f   if( i<16 ) mNoO
8e10: 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b  mit |= (1 << i);
8e20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d  .        if( op=
8e30: 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e  =WO_LT ) pIdxCon
8e40: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b  s[j].op = WO_LE;
8e50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d  .        if( op=
8e60: 3d 57 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e  =WO_GT ) pIdxCon
8e70: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b  s[j].op = WO_GE;
8e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8e90: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
8ea0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
8eb0: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
8ec0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
8ed0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8ee0: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
8ef0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
8f00: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
8f10: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
8f20: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
8f30: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
8f40: 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f  r;.  }..  *pmNoO
8f50: 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20  mit = mNoOmit;. 
8f60: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
8f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
8f80: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
8f90: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
8fa0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8fb0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
8fc0: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
8fd0: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
8fe0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
8ff0: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
9000: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
9010: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
9020: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
9030: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
9040: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
9050: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
9060: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
9070: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
9080: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
9090: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
90a0: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
90b0: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
90c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
90d0: 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
90e0: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
90f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
9100: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
9110: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
9120: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
9130: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
9140: 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
9150: 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
9160: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
9170: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
9180: 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
9190: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
91a0: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
91b0: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
91c0: 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
91d0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
91e0: 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
91f0: 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
9200: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
9210: 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
9220: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9230: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
9240: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
9250: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
9260: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
9270: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
9280: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
9290: 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  >pVtab;.  int rc
92a0: 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
92b0: 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
92c0: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
92d0: 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
92e0: 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
92f0: 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
9300: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
9320: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9330: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9340: 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d  OomFault(pParse-
9350: 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >db);.    }else 
9360: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
9370: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
9380: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9390: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
93a0: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
93b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
93c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
93d0: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
93e0: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
93f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9400: 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
9410: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
9420: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
9430: 23 69 66 20 30 0a 20 20 2f 2a 20 54 68 69 73 20  #if 0.  /* This 
9440: 65 72 72 6f 72 20 69 73 20 6e 6f 77 20 63 61 75  error is now cau
9450: 67 68 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ght by the calle
9460: 72 2e 0a 20 20 2a 2a 20 53 65 61 72 63 68 20 66  r..  ** Search f
9470: 6f 72 20 22 78 42 65 73 74 49 6e 64 65 78 20 6d  or "xBestIndex m
9480: 61 6c 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f  alfunction" belo
9490: 77 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  w */.  for(i=0; 
94a0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
94b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
94c0: 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
94d0: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
94e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
94f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
9500: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9510: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9520: 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
9530: 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
9540: 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
9550: 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
9560: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
9570: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
9580: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
9590: 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rr;.}.#endif /* 
95a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
95b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
95c0: 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  E) */..#ifdef SQ
95d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
95e0: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
95f0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
9600: 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74  cation of a part
9610: 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67  icular key among
9620: 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a   all keys in an.
9630: 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65  ** index.  Store
9640: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
9650: 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73  aStat as follows
9660: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74  :.**.**    aStat
9670: 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [0]      Est. nu
9680: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73  mber of rows les
9690: 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20  s than pRec.**  
96a0: 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20    aStat[1]      
96b0: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
96c0: 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65  ows equal to pRe
96d0: 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  c.**.** Return t
96e0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
96f0: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74  sample that is t
9700: 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70  he smallest samp
9710: 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72  le that.** is gr
9720: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
9730: 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74  ual to pRec. Not
9740: 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65  e that this inde
9750: 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65  x is not an inde
9760: 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53  x.** into the aS
9770: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20  ample[] array - 
9780: 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69  it is an index i
9790: 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65  nto a virtual se
97a0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20  t of samples.** 
97b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
97c0: 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65  tents of aSample
97d0: 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  [] and the numbe
97e0: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72  r of fields in r
97f0: 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20  ecord .** pRec. 
9800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9810: 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
9820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9840: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9850: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
9860: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
9870: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
9880: 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
9890: 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  of */.  Unpacked
98a0: 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20  Record *pRec,   
98b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66      /* Vector of
98c0: 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69   values to consi
98d0: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
98e0: 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
98f0: 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70       /* Round up
9900: 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64   if true.  Round
9910: 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a   down if false *
9920: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74  /.  tRowcnt *aSt
9930: 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  at              
9940: 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72  /* OUT: stats wr
9950: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
9960: 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a  .  IndexSample *
9970: 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
9980: 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69  aSample;.  int i
9990: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
99a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
99b0: 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74  of required stat
99c0: 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e  s in anEq[] etc.
99d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
9a00: 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52  rst sample >= pR
9a10: 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d  ec */.  int iSam
9a20: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
9a30: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
9a40: 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
9a50: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
9a60: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  Rec */.  int iMi
9a70: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
9a80: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
9a90: 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20   sample not yet 
9aa0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
9ab0: 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  iTest;          
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
9ad0: 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a  sample to test *
9ae0: 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20  /.  int res;    
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d  /* Result of com
9b10: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
9b20: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c  n */.  int nFiel
9b30: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9b50: 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a  fields in pRec *
9b60: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77  /.  tRowcnt iLow
9b70: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
9b80: 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71  /* anLt[] + anEq
9b90: 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61  [] of largest sa
9ba0: 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a  mple pRec is > *
9bb0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9bc0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9bd0: 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
9be0: 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
9bf0: 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29  ssert( pRec!=0 )
9c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
9c10: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
9c20: 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
9c30: 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d  Field>0 && pRec-
9c40: 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e  >nField<=pIdx->n
9c50: 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20  SampleCol );..  
9c60: 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73  /* Do a binary s
9c70: 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68  earch to find th
9c80: 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67  e first sample g
9c90: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9ca0: 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65  qual.  ** to pRe
9cb0: 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  c. If pRec conta
9cc0: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ins a single fie
9cd0: 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73  ld, the set of s
9ce0: 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68  amples to search
9cf0: 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20  .  ** is simply 
9d00: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9d10: 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70  ray. If the samp
9d20: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
9d30: 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20   contain more.  
9d40: 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c  ** than one fiel
9d50: 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66  ds, all fields f
9d60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72  ollowing the fir
9d70: 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  st are ignored..
9d80: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65    **.  ** If pRe
9d90: 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65  c contains N fie
9da0: 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20  lds, where N is 
9db0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74  more than one, t
9dc0: 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74  hen as well as t
9dd0: 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20  he.  ** samples 
9de0: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72  in aSample[] (tr
9df0: 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65  uncated to N fie
9e00: 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63 68  lds), the search
9e10: 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a   also has to.  *
9e20: 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69  * consider prefi
9e30: 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d  xes of those sam
9e40: 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ples. For exampl
9e50: 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  e, if the set of
9e60: 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e   samples.  ** in
9e70: 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a   aSample is:.  *
9e80: 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70  *.  **     aSamp
9e90: 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a  le[0] = (a, 5) .
9ea0: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9eb0: 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20  [1] = (a, 10) . 
9ec0: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
9ed0: 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a  2] = (b, 5) .  *
9ee0: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d  *     aSample[3]
9ef0: 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a   = (c, 100) .  *
9f00: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d  *     aSample[4]
9f10: 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a   = (c, 105).  **
9f20: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73  .  ** Then the s
9f30: 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f 75  earch space shou
9f40: 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68  ld ideally be th
9f50: 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20  e samples above 
9f60: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e  and the .  ** un
9f70: 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b 61  ique prefixes [a
9f80: 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20  ], [b] and [c]. 
9f90: 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20 69  But since that i
9fa0: 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69  s hard to organi
9fb0: 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ze, .  ** the co
9fc0: 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72  de actually sear
9fd0: 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20  ches this set:. 
9fe0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20   **.  **     0: 
9ff0: 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a  (a) .  **     1:
a000: 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
a010: 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20    2: (a, 10) .  
a020: 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30  **     3: (a, 10
a030: 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28  ) .  **     4: (
a040: 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20  b) .  **     5: 
a050: 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (b, 5) .  **    
a060: 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20   6: (c) .  **   
a070: 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20    7: (c, 100) . 
a080: 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31   **     8: (c, 1
a090: 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20  05).  **     9: 
a0a0: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20  (c, 105).  **.  
a0b0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70  ** For each samp
a0c0: 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  le in the aSampl
a0d0: 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d  e[] array, N sam
a0e0: 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74  ples are present
a0f0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66   in the.  ** eff
a100: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72  ective sample ar
a110: 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76  ray. In the abov
a120: 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64  e, samples 0 and
a130: 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20   1 are based on 
a140: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61  .  ** sample aSa
a150: 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73  mple[0]. Samples
a160: 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d   2 and 3 on aSam
a170: 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a  ple[1] etc..  **
a180: 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d  .  ** Often, sam
a190: 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c  ple i of each bl
a1a0: 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69  ock of N effecti
a1b0: 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28  ve samples has (
a1c0: 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a  i+1) fields..  *
a1d0: 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20 73  * Except, each s
a1e0: 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74  ample may be ext
a1f0: 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20  ended to ensure 
a200: 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61 74  that it is great
a210: 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20  er than or.  ** 
a220: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65  equal to the pre
a230: 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20  vious sample in 
a240: 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65  the array. For e
a250: 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61  xample, in the a
a260: 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70  bove, .  ** samp
a270: 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72 73  le 2 is the firs
a280: 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c  t sample of a bl
a290: 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73  ock of N samples
a2a0: 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69 74  , so at first it
a2b0: 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74   .  ** appears t
a2c0: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65  hat it should be
a2d0: 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65   1 field in size
a2e0: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  . However, that 
a2f0: 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20  would make it . 
a300: 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   ** smaller than
a310: 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68   sample 1, so th
a320: 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
a330: 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20  would not work. 
a340: 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20  As a result, .  
a350: 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64 65  ** it is extende
a360: 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e  d to two fields.
a370: 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73 20   The duplicates 
a380: 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74 65  that this create
a390: 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63  s do not .  ** c
a3a0: 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
a3b0: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64  s..  */.  nField
a3c0: 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b   = pRec->nField;
a3d0: 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  .  iCol = 0;.  i
a3e0: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e  Sample = pIdx->n
a3f0: 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b  Sample * nField;
a400: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69  .  do{.    int i
a410: 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Samp;           
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a430: 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f  x in aSample[] o
a440: 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  f test sample */
a450: 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a470: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a480: 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73  fields in test s
a490: 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54  ample */..    iT
a4a0: 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d  est = (iMin+iSam
a4b0: 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d  ple)/2;.    iSam
a4c0: 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65  p = iTest / nFie
a4d0: 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d  ld;.    if( iSam
a4e0: 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  p>0 ){.      /* 
a4f0: 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66  The proposed eff
a500: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73  ective sample is
a510: 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d   a prefix of sam
a520: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  ple aSample[iSam
a530: 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65  p]..      ** Spe
a540: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73  cifically, the s
a550: 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f  hortest prefix o
a560: 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20  f at least (1 + 
a570: 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20  iTest%nField) . 
a580: 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74       ** fields t
a590: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
a5a0: 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
a5b0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a5c0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
a5d0: 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65  (n=(iTest % nFie
a5e0: 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c  ld) + 1; n<nFiel
a5f0: 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; n++){.       
a600: 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61   if( aSample[iSa
a610: 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21  mp-1].anLt[n-1]!
a620: 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  =aSample[iSamp].
a630: 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61  anLt[n-1] ) brea
a640: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
a650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
a660: 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d  iTest + 1;.    }
a670: 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65  ..    pRec->nFie
a680: 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20  ld = n;.    res 
a690: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
a6a0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a6b0: 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61  le[iSamp].n, aSa
a6c0: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70  mple[iSamp].p, p
a6d0: 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65  Rec);.    if( re
a6e0: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  s<0 ){.      iLo
a6f0: 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53  wer = aSample[iS
a700: 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b  amp].anLt[n-1] +
a710: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
a720: 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20  anEq[n-1];.     
a730: 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b   iMin = iTest+1;
a740: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
a750: 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c  es==0 && n<nFiel
a760: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  d ){.      iLowe
a770: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
a780: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20  p].anLt[n-1];.  
a790: 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
a7a0: 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  +1;.      res = 
a7b0: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
a7c0: 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69       iSample = i
a7d0: 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c  Test;.      iCol
a7e0: 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   = n-1;.    }.  
a7f0: 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69  }while( res && i
a800: 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20  Min<iSample );. 
a810: 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e   i = iSample / n
a820: 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  Field;..#ifdef S
a830: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a840: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
a850: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
a860: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a870: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f  binary search co
a880: 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f  de.  ** above fo
a890: 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e  und the right an
a8a0: 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b  swer. This block
a8b0: 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f   serves no purpo
a8c0: 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68  se other.  ** th
a8d0: 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  an to invoke the
a8e0: 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20   asserts.  */.  
a8f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
a900: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
a910: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ){.    if( res==
a920: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
a930: 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75   (res==0) is tru
a940: 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  e, then pRec mus
a950: 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61  t be equal to sa
a960: 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20  mple i. */.     
a970: 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
a980: 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
a990: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
a9a0: 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20  nField-1 );.    
a9b0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
a9c0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61   nField;.      a
a9d0: 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
a9e0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
a9f0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
aa00: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
aa10: 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20 20  Rec) .          
aa20: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
aa30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20  mallocFailed .  
aa40: 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
aa50: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73  {.      /* Unles
aa60: 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  s i==pIdx->nSamp
aa70: 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  le, indicating t
aa80: 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72 67  hat pRec is larg
aa90: 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  er than.      **
aaa0: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
aab0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
aac0: 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62  ray, pRec must b
aad0: 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
aae0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f  he.      ** (iCo
aaf0: 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
ab00: 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20  x of sample i.  
ab10: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ab20: 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i<=pIdx->nSampl
ab30: 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20  e && i>=0 );.   
ab40: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
ab50: 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20  = iCol+1;.      
ab60: 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d  assert( i==pIdx-
ab70: 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
ab80: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
ab90: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
aba0: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
abb0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
abc0: 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20  c)>0.           
abd0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
abe0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
abf0: 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30        /* if i==0
ac00: 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68   and iCol==0, th
ac10: 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20 69  en record pRec i
ac20: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61  s smaller than a
ac30: 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20  ll samples.     
ac40: 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70   ** in the aSamp
ac50: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65  le[] array. Othe
ac60: 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e  rwise, if (iCol>
ac70: 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  0) then pRec mus
ac80: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72  t.      ** be gr
ac90: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
aca0: 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c  ual to the (iCol
acb0: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
acc0: 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20  f sample i..    
acd0: 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74    ** If (i>0), t
ace0: 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c  hen pRec must al
acf0: 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  so be greater th
ad00: 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e  an sample (i-1).
ad10: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
ad20: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
ad30: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
ad40: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  iCol;.        as
ad50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
ad60: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
ad70: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
ad80: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
ad90: 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  <=0.            
ada0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
adb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
adc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
add0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
ade0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
adf0: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20  nField;.        
ae00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
ae10: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
ae20: 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
ae30: 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
ae40: 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20   pRec)<0.       
ae50: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
ae60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ae70: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
ae80: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
ae90: 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
aea0: 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65  BUG */..  if( re
aeb0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52  s==0 ){.    /* R
aec0: 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65 71  ecord pRec is eq
aed0: 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20  ual to sample i 
aee0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
aef0: 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b  Col==nField-1 );
af00: 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
af10: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
af20: 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74  iCol];.    aStat
af30: 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
af40: 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  .anEq[iCol];.  }
af50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20  else{.    /* At 
af60: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
af70: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
af80: 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65  refix of aSample
af90: 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
afa0: 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20   .    ** sample 
afb0: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
afc0: 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69  than pRec. Or, i
afd0: 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
afe0: 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20  le then pRec.   
aff0: 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68   ** is larger th
b000: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69  an all samples i
b010: 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a  n the array. */.
b020: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
b030: 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
b040: 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i>=pIdx->nSamp
b050: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70  le ){.      iUpp
b060: 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
b070: 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69  stToInt(pIdx->ai
b080: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
b090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b0a0: 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
b0b0: 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
b0c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
b0d0: 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
b0e0: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b  .      iGap = 0;
b0f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b100: 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20    iGap = iUpper 
b110: 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a  - iLower;.    }.
b120: 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
b130: 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
b140: 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20  (iGap*2)/3;.    
b150: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
b160: 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20  p = iGap/3;.    
b170: 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  }.    aStat[0] =
b180: 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a   iLower + iGap;.
b190: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70      aStat[1] = p
b1a0: 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65  Idx->aAvgEq[nFie
b1b0: 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ld-1];.  }..  /*
b1c0: 20 52 65 73 74 6f 72 65 20 74 68 65 20 70 52 65   Restore the pRe
b1d0: 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20  c->nField value 
b1e0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b1f0: 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46  .  */.  pRec->nF
b200: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
b210: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e   return i;.}.#en
b220: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
b230: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b240: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT4 */../*.** If
b250: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
b260: 20 70 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d   pTerm is a term
b270: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
b280: 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  n upper or lower
b290: 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72  .** bound on a r
b2a0: 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f  ange scan. Witho
b2b0: 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70  ut considering p
b2c0: 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69  Term, it is esti
b2d0: 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74  mated .** that t
b2e0: 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
b2f0: 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68  it nNew rows. Th
b300: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b310: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  rns the number.*
b320: 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
b330: 65 20 76 69 73 69 74 65 64 20 61 66 74 65 72 20  e visited after 
b340: 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74  taking pTerm int
b350: 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a  o account..**.**
b360: 20 49 66 20 74 68 65 20 75 73 65 72 20 65 78 70   If the user exp
b370: 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
b380: 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  d a likelihood()
b390: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
b3a0: 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  term,.** then th
b3b0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
b3c0: 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  s the likelihood
b3d0: 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74   multiplied by t
b3e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
b3f0: 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65  input rows. Othe
b400: 72 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63  rwise, this func
b410: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
b420: 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c  t an "IS NOT NUL
b430: 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61  L" term.** has a
b440: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
b450: 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  .50, and any oth
b460: 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69  er term a likeli
b470: 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f  hood of 0.25..*/
b480: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
b490: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
b4a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
b4b0: 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a  , LogEst nNew){.
b4c0: 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20    LogEst nRet = 
b4d0: 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72  nNew;.  if( pTer
b4e0: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  m ){.    if( pTe
b4f0: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
b500: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b   ){.      nRet +
b510: 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
b520: 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ob;.    }else if
b530: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
b540: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
b550: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
b560: 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61   -= 20;        a
b570: 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
b580: 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
b590: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b5a0: 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64  n nRet;.}...#ifd
b5b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b5c0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
b5d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
b5e0: 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20   affinity for a 
b5f0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
b600: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68   an index..*/.ch
b610: 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43  ar sqlite3IndexC
b620: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71  olumnAffinity(sq
b630: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
b640: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
b650: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  ){.  assert( iCo
b660: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64  l>=0 && iCol<pId
b670: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
b680: 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41  if( !pIdx->zColA
b690: 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ff ){.    if( sq
b6a0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
b6b0: 74 79 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d  tyStr(db, pIdx)=
b6c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
b6d0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
b6e0: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e  .  return pIdx->
b6f0: 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d  zColAff[iCol];.}
b700: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
b710: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b720: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
b730: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
b740: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
b750: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
b760: 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
b770: 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67  ted by a.** rang
b780: 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70  e-scan on a skip
b790: 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72  -scan index. For
b7a0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
b7b0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
b7c0: 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29  1 ON t1(a, b, c)
b7d0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  ;.**   SELECT * 
b7e0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
b7f0: 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20  ? AND c BETWEEN 
b800: 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56  ? AND ?;.**.** V
b810: 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  alue pLoop->nOut
b820: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
b830: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
b840: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
b850: 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f  s .** visited fo
b860: 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20  r scanning (a=? 
b870: 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66  AND b=?). This f
b880: 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20  unction reduces 
b890: 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a  that estimate .*
b8a0: 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72  * by some factor
b8b0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
b8c0: 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f  the (c BETWEEN ?
b8d0: 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69   AND ?) expressi
b8e0: 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74  on based.** on t
b8f0: 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f  he stat4 data fo
b900: 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69  r the index. thi
b910: 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70  s scan will be p
b920: 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65  eformed multiple
b930: 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65   .** times (once
b940: 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20   for each (a,b) 
b950: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74  combination that
b960: 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73   matches a=?) is
b970: 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20   dealt with .** 
b980: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
b990: 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69  *.** It does thi
b9a0: 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  s by scanning th
b9b0: 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20  rough all stat4 
b9c0: 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69  samples, compari
b9d0: 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74  ng values.** ext
b9e0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
b9f0: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69  er and pUpper wi
ba00: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
ba10: 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  ding column in e
ba20: 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49  ach.** sample. I
ba30: 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68  f L and U are th
ba40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  e number of samp
ba50: 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  les found to be 
ba60: 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20  less than or.** 
ba70: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c  equal to the val
ba80: 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ues extracted fr
ba90: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
baa0: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
bab0: 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74  y, and.** N is t
bac0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
bad0: 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20  of samples, the 
bae0: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75  pLoop->nOut valu
baf0: 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  e is adjusted.**
bb00: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bb10: 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74  **   nOut = nOut
bb20: 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20   * ( min(U - L, 
bb30: 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49  1) / N ).**.** I
bb40: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
bb50: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
bb60: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
bb70: 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20   from the term, 
bb80: 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a  L is.** set to z
bb90: 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69  ero. If pUpper i
bba0: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
bbb0: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
bbc0: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a  racted from it,.
bbd0: 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e  ** U is set to N
bbe0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
bbf0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
bc00: 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20  sets *pbDone to 
bc10: 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  1 before returni
bc20: 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
bc30: 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20  if no value can 
bc40: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
bc50: 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20  m either pLower 
bc60: 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73  or pUpper (and s
bc70: 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74  o the.** estimat
bc80: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
bc90: 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65  of rows delivere
bca0: 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  d remains unchan
bcb0: 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a  ged), *pbDone.**
bcc0: 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a   is left as is..
bcd0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
bce0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
bcf0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
bd00: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
bd10: 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54  rwise, .** SQLIT
bd20: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
bd30: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b  int whereRangeSk
bd40: 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  ipScanEst(.  Par
bd50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bd60: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
bd70: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
bd80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
bd90: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
bda0: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
bdb0: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
bdc0: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
bdd0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
bde0: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
bdf0: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
be00: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
be10: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
be20: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
be30: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
be40: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
be50: 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20   .nOut value of 
be60: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
be70: 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20  nt *pbDone      
be80: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
be90: 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f  ue if at least o
bea0: 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65  ne expr. value e
beb0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20  xtracted */.){. 
bec0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
bed0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
bee0: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
bef0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
bf00: 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q;.  sqlite3 *db
bf10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
bf20: 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31   int nLower = -1
bf30: 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d  ;.  int nUpper =
bf40: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20   p->nSample+1;. 
bf50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bf60: 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20  _OK;.  u8 aff = 
bf70: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
bf80: 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70  mnAffinity(db, p
bf90: 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65  , nEq);.  CollSe
bfa0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
bfb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
bfc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
bfd0: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
bfe0: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
bff0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c000: 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
c010: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
c020: 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
c030: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
c040: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
c050: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c060: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
c070: 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
c080: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
c090: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
c0a0: 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
c0b0: 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
c0c0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c0d0: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
c0e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
c0f0: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
c100: 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
c110: 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
c120: 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
c130: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c140: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c150: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
c160: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
c170: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
c180: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
c190: 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
c1a0: 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
c1b0: 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
c1c0: 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
c1d0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
c1e0: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
c1f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c200: 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
c210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c220: 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
c230: 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
c240: 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
c250: 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
c260: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
c270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c280: 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
c290: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
c2a0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
c2b0: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
c2c0: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
c2d0: 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
c2e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
c2f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c300: 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
c310: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
c320: 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
c330: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
c340: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
c350: 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
c360: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
c370: 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
c380: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
c390: 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
c3a0: 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
c3b0: 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
c3c0: 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
c3d0: 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
c3e0: 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
c3f0: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
c400: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
c410: 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
c420: 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
c430: 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
c440: 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
c450: 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
c460: 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
c470: 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
c480: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
c490: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
c4a0: 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
c4b0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
c4c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
c4d0: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
c4e0: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
c4f0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
c500: 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
c510: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
c520: 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
c530: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
c540: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
c550: 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
c560: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
c570: 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
c580: 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
c590: 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
c5a0: 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
c5b0: 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
c5c0: 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
c5d0: 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
c5e0: 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
c5f0: 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
c600: 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
c610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c620: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
c630: 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
c640: 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
c650: 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
c660: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c670: 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
c680: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
c690: 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
c6a0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
c6b0: 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
c6c0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
c6d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c6e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c6f0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
c700: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
c710: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
c720: 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
c730: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
c740: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
c750: 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
c760: 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
c770: 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
c780: 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
c790: 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
c7a0: 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
c7b0: 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
c7c0: 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
c7d0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
c7e0: 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
c7f0: 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
c800: 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
c810: 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
c820: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
c830: 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
c840: 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
c850: 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
c860: 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
c870: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
c880: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
c890: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
c8c0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
c8d0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
c8e0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
c900: 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
c910: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
c920: 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
c930: 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
c940: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
c950: 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
c960: 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
c970: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
c980: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
c990: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
c9a0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
c9b0: 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
c9c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
c9d0: 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
c9e0: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
c9f0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
ca00: 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
ca10: 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
ca20: 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
ca30: 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
ca40: 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
ca50: 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
ca60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
ca70: 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
ca80: 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
ca90: 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
caa0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
cab0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
cac0: 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
cad0: 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
cae0: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
caf0: 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
cb00: 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
cb10: 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
cb20: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
cb30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
cb40: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
cb50: 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
cb60: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
cb70: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
cb80: 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
cb90: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
cba0: 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
cbb0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
cbc0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
cbd0: 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
cbe0: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
cbf0: 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
cc00: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
cc10: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
cc20: 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
cc30: 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
cc40: 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
cc50: 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
cc60: 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
cc70: 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75  is 0, then *pnOu
cc80: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
cc90: 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74  of .** rows in t
cca0: 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  he index. Assumi
ccb0: 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
ccc0: 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64  rs, *pnOut is ad
ccd0: 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29  justed (reduced)
cce0: 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  .** to account f
ccf0: 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  or the range con
cd00: 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  straints pLower 
cd10: 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
cd20: 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
cd30: 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
cd40: 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
cd50: 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
cd60: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
cd70: 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67  d, a single rang
cd80: 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
cd90: 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
cda0: 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
cdb0: 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20  r of 4. .** and 
cdc0: 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72  a pair of constr
cdd0: 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
cde0: 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20  <?) reduces the 
cdf0: 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
ce00: 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74  of.** rows visit
ce10: 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ed by a factor o
ce20: 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 64..*/.static 
ce30: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
ce40: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
ce50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
ce60: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
ce70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
ce80: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
ce90: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
cea0: 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20  er,.  WhereTerm 
ceb0: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
cec0: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
ced0: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
cee0: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
cef0: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
cf00: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
cf10: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
cf20: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
cf30: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
cf40: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
cf50: 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20  p *pLoop     /* 
cf60: 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74  Modify the .nOut
cf70: 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e   and maybe .rRun
cf80: 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
cf90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cfa0: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  OK;.  int nOut =
cfb0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20   pLoop->nOut;.  
cfc0: 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69  LogEst nNew;..#i
cfd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cfe0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
cff0: 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
d000: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
d010: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
d020: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
d030: 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  .nEq;..  if( p->
d040: 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71  nSample>0 && nEq
d050: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  <p->nSampleCol. 
d060: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
d070: 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d  nEnabled(pParse-
d080: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  >db, SQLITE_Stat
d090: 33 34 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  34).  ){.    if(
d0a0: 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e   nEq==pBuilder->
d0b0: 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20  nRecValid ){.   
d0c0: 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72     UnpackedRecor
d0d0: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
d0e0: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20  er->pRec;.      
d0f0: 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
d100: 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70      int nBtm = p
d110: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  Loop->u.btree.nB
d120: 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  tm;.      int nT
d130: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
d140: 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20  ree.nTop;..     
d150: 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
d160: 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
d170: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
d180: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
d190: 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
d1a0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
d1b0: 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
d1c0: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
d1d0: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
d1e0: 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
d1f0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
d200: 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
d210: 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
d220: 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
d230: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
d240: 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
d250: 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
d260: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
d270: 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
d280: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
d290: 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
d2a0: 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
d2b0: 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
d2c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
d2d0: 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
d2e0: 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
d2f0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
d300: 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
d310: 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
d320: 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
d330: 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
d340: 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
d350: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
d360: 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
d370: 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
d380: 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
d390: 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
d3a0: 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
d3b0: 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
d3c0: 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
d3d0: 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
d3e0: 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
d3f0: 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
d400: 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
d410: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
d420: 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
d430: 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
d440: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
d450: 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
d460: 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
d470: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d480: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d490: 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
d4a0: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d4b0: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d4c0: 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
d4d0: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
d4e0: 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
d4f0: 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
d500: 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
d510: 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
d520: 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
d530: 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
d540: 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
d550: 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
d560: 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
d570: 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
d580: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
d590: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
d5a0: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
d5b0: 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
d5c0: 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
d5d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d5e0: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
d5f0: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
d600: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
d610: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
d620: 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
d630: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
d640: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d650: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d660: 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
d670: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
d680: 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
d690: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
d6a0: 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
d6b0: 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
d6c0: 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
d6d0: 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
d6e0: 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
d6f0: 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
d700: 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
d710: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
d720: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
d730: 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
d740: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
d750: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65   }.      /* Dete
d760: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
d770: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
d780: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
d790: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
d7a0: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d7b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
d7c0: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
d7d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d7e0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
d7f0: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
d800: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
d810: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
d820: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
d830: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
d840: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
d850: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
d860: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
d870: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
d880: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
d890: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d8a0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d8b0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
d8c0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
d8d0: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
d8e0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d8f0: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
d900: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
d910: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
d920: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
d930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
d940: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d950: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
d960: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
d970: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
d980: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
d990: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
d9a0: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
d9b0: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
d9c0: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
d9d0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
d9e0: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
d9f0: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
da00: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
da10: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
da20: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
da30: 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e 42 74     SWAP(int, nBt
da40: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  m, nTop);.      
da50: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
da60: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
da70: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
da80: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
da90: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
daa0: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
dab0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
dae0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
daf0: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
db00: 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
db10: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
db20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
db30: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
db40: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
db50: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
db60: 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Btm, nEq, &n);. 
db70: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
db80: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
db90: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
dba0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
dbb0: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
dbc0: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
dbd0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
dbe0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
dbf0: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
dc00: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
dc10: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
dc20: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
dc30: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
dc40: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
dc50: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
dc60: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
dc70: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
dc80: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
dc90: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
dca0: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
dcb0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
dcc0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
dcd0: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
dce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dcf0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
dd00: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
dd10: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
dd20: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
dd30: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
dd40: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
dd50: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd70: 20 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   Values extracte
dd80: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
dd90: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
dda0: 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
ddb0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
ddc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ddd0: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
dde0: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
ddf0: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f  pRec, pExpr, nTo
de00: 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20  p, nEq, &n);.   
de10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
de20: 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20  ITE_OK && n ){. 
de30: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
de40: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
de50: 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47   u16 mask = WO_G
de60: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
de70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
de80: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
de90: 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28  pr)>n ) mask = (
dea0: 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20  WO_LE|WO_LT);.  
deb0: 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20          iUprIdx 
dec0: 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
ded0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
dee0: 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
def0: 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
df00: 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
df10: 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b  tor & mask) ? a[
df20: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
df30: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
df40: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
df50: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
df60: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
df70: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
df80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
df90: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
dfa0: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
dfb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dfc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
dfd0: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
dfe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
dff0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
e000: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
e010: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
e020: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
e030: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
e040: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
e050: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
e060: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
e070: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
e080: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
e090: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
e0a0: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
e0b0: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
e0c0: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
e0d0: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
e0e0: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
e0f0: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
e100: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
e110: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
e120: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
e130: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e140: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
e150: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
e160: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
e170: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
e180: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e190: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
e1a0: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
e1b0: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
e1c0: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
e1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e1e0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
e1f0: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
e200: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
e210: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
e220: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
e230: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
e240: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
e270: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
e280: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
e290: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e2a0: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
e2b0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
e2c0: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
e2d0: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
e2e0: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
e2f0: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
e300: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
e310: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e320: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
e330: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
e340: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
e350: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
e360: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
e370: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
e380: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
e390: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
e3a0: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
e3b0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
e3c0: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
e3d0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
e3e0: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
e3f0: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
e400: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
e410: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
e420: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
e430: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
e440: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
e450: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
e460: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
e470: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
e480: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
e490: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
e4a0: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
e4b0: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
e4c0: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
e4d0: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
e4e0: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
e4f0: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
e500: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
e510: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
e520: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
e530: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
e540: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
e550: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
e560: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
e570: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
e580: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
e590: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
e5a0: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
e5b0: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
e5c0: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
e5d0: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
e5e0: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
e5f0: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
e600: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
e610: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
e620: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
e630: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
e640: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
e650: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
e660: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
e670: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
e680: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
e690: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
e6a0: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
e6b0: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
e6c0: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
e6d0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
e700: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
e710: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
e720: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
e730: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e740: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e750: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e760: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
e770: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
e780: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
e790: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
e7a0: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
e7b0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
e7c0: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
e7d0: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
e7e0: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
e7f0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
e800: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
e810: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
e820: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
e830: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
e840: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
e850: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
e860: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
e870: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
e880: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
e890: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
e8a0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
e8b0: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
e8c0: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
e8d0: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
e8e0: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
e8f0: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
e900: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
e910: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
e920: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
e930: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
e940: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
e950: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
e960: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
e970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
e980: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
e990: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
e9a0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e9b0: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
e9c0: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
e9d0: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
e9e0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
e9f0: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
ea00: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
ea10: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
ea20: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
ea30: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
ea40: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
ea50: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
ea60: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
ea70: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
ea80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ea90: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
eaa0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
eab0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
eac0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
ead0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
eae0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
eaf0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
eb00: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
eb10: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
eb20: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
eb30: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
eb40: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
eb50: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
eb60: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
eb70: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
eb80: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
eb90: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
eba0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
ebb0: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
ebc0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
ebd0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
ebe0: 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Rec;.  int rc;  
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
ec10: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ec20: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
ec30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
ec40: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
ec50: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
ec60: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
ec70: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
ec80: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
ec90: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
eca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ecb0: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
ecc0: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ecd0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
ece0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
ecf0: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
ed00: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
ed10: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
ed20: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
ed30: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
ed40: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
ed50: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
ed60: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
ed70: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
ed80: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
ed90: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
eda0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
edb0: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
edc0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
edd0: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
ede0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
edf0: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
ee00: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
ee10: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
ee20: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
ee30: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
ee40: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
ee50: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
ee60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ee70: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
ee80: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
ee90: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
eea0: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 31 2c  &pRec, pExpr, 1,
eeb0: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
eec0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
eed0: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
eee0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
eef0: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
ef00: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
ef10: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
ef20: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
ef30: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
ef40: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
ef50: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
ef60: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
ef70: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
ef80: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
ef90: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
efc0: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
efd0: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
efe0: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
eff0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f000: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
f010: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
f020: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f030: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
f040: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
f050: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f060: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
f070: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
f080: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
f090: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
f0a0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
f0b0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
f0c0: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
f0d0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
f0e0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
f0f0: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
f100: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
f110: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
f120: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
f130: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
f140: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
f150: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
f160: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
f170: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
f180: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
f190: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
f1a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f1b0: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
f1c0: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
f1d0: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
f1e0: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
f1f0: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
f200: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
f210: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
f220: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
f230: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
f240: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
f250: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
f260: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
f270: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
f280: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
f290: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
f2a0: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
f2b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f2c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
f2d0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
f2e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
f2f0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
f300: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
f310: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
f320: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
f330: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
f340: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
f350: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
f360: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
f370: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
f380: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
f390: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
f3a0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
f3b0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
f3c0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
f3d0: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
f3e0: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
f3f0: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
f400: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
f410: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
f420: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
f430: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f440: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
f450: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f460: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
f470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f480: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
f490: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
f4a0: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
f4b0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
f4c0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
f4d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
f4e0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f500: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f510: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
f520: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
f530: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f540: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
f550: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f560: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
f570: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
f580: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
f590: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
f5a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
f5b0: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
f5c0: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
f5d0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f5e0: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
f5f0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f610: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
f620: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
f630: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
f640: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
f650: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f660: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
f670: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
f680: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
f690: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
f6a0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
f6b0: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
f6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f6d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f6e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
f6f0: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
f700: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f710: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
f720: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
f730: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
f740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f750: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
f760: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
f770: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
f780: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
f790: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f7a0: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
f7b0: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
f7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f7d0: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63   zType[4];.    c
f7e0: 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20  har zLeft[50];. 
f7f0: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
f800: 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
f810: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
f820: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
f830: 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
f840: 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
f850: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f860: 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
f870: 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
f880: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
f890: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
f8a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
f8b0: 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
f8c0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
f8d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
f8e0: 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71  NGLE ){.      sq
f8f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
f900: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
f910: 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d  ft,"left={%d:%d}
f920: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f930: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
f940: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
f950: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
f960: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f970: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
f980: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26  or & WO_OR)!=0 &
f990: 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e  & pTerm->u.pOrIn
f9a0: 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo!=0 ){.      s
f9b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f9c0: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f9d0: 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30  eft,"indexable=0
f9e0: 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20  x%lld", .       
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
fa10: 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20  ->indexable);.  
fa20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
fa30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
fa40: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
fa50: 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70  eft,"left=%d", p
fa60: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
fa70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fa80: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fa90: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
faa0: 33 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70  3d %p %s %-12s p
fab0: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
fac0: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
fad0: 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  x",.       iTerm
fae0: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
faf0: 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72  zLeft, pTerm->tr
fb00: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
fb10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fb20: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
fb30: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
fb40: 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->iField ){.    
fb50: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fb60: 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64  intf(" iField=%d
fb70: 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65  \n", pTerm->iFie
fb80: 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ld);.    }else{.
fb90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
fba0: 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
fbb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fbc0: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
fbd0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
fbe0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
fbf0: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
fc00: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
fc10: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
fc20: 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  te content of a 
fc30: 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76  WhereClause.*/.v
fc40: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
fc50: 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72  ClausePrint(Wher
fc60: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
fc70: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
fc80: 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; i<pWC->nTerm;
fc90: 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65   i++){.    where
fca0: 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e  TermPrint(&pWC->
fcb0: 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  a[i], i);.  }.}.
fcc0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
fcd0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
fce0: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
fcf0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
fd00: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
fd10: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
fd20: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
fd30: 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
fd40: 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
fd50: 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
fd60: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
fd70: 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
fd80: 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
fd90: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33  pTabList->nSrc+3
fda0: 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/4;.  struct Sr
fdb0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
fdc0: 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
fdd0: 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
fde0: 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
fdf0: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
fe00: 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d    Bitmask mAll =
fe10: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
fe20: 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73  (nb*4)) - 1;.  s
fe30: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fe40: 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
fe50: 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
fe60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe70: 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
fe80: 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
fe90: 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20  nb, p->prereq & 
fea0: 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mAll);.  sqlite3
feb0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
fec0: 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
fed0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
fee0: 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
fef0: 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
ff00: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
ff10: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
ff20: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
ff30: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
ff40: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ff50: 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
ff60: 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
ff70: 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
ff80: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
ff90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
ffa0: 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
ffb0: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
ffc0: 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
ffd0: 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
ffe0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
fff0: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
10000 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
10010 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
10020 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
10030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10040 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10050 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
10060 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
10070 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
10080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10090 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
100a0 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
100b0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
100c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
100d0 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
100e0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
100f0 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
10100 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
10110 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
10120 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
10130 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
10140 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
10150 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10160 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
10170 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
10180 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
10190 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
101a0 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
101b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
101c0 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
101d0 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
101e0 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
101f0 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
10200 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
10210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10220 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
10230 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
10240 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
10250 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
10260 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
10270 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
10280 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
10290 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
102a0 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
102b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
102c0 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
102d0 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
102e0 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
102f0 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
10300 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
10310 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
10320 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10330 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
10340 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
10350 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
10360 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
10370 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
10380 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10390 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
103a0 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
103b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
103c0 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
103d0 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
103e0 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
103f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10400 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
10410 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
10420 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
10430 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
10440 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
10450 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
10460 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
10470 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
10480 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
10490 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
104a0 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
104b0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
104c0 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
104d0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
104e0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
104f0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10500 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
10510 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
10520 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
10530 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
10540 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
10550 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10560 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
10570 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
10580 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
10590 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
105a0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
105b0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
105c0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
105d0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
105e0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
105f0 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
10600 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
10610 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
10620 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
10630 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
10640 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10650 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
10660 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
10670 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10680 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  NN(db, p->u.btre
10690 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
106a0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
106b0 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
106c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
106d0 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
106e0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
106f0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10700 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10710 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
10720 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
10730 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
10740 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
10750 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
10760 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10770 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
10780 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
10790 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
107a0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
107b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
107c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
107d0 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
107e0 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
107f0 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
10800 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
10810 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
10820 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10830 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
10840 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
10850 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
10860 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
10870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
10880 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
10890 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
108a0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
108b0 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
108c0 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
108d0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
108e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
108f0 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
10900 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
10910 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
10920 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
10930 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
10940 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
10950 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
10960 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10970 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
10980 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
10990 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
109a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
109b0 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
109c0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
109d0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
109e0 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
109f0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10a00 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
10a10 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
10a20 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
10a30 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
10a40 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
10a50 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
10a60 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
10a70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
10a80 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
10a90 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
10aa0 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
10ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ac0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10ad0 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
10ae0 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
10af0 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
10b00 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
10b10 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
10b20 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
10b30 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
10b40 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
10b50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10b60 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
10b70 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
10b80 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
10b90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
10ba0 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10bb0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10bc0 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
10bd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10be0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10bf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10c00 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
10c10 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10c20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10c30 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
10c40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10c50 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
10c60 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
10c70 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
10c80 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
10c90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
10ca0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
10cb0 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
10cc0 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
10cd0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10ce0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
10cf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
10d00 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b  rt( pWInfo!=0 );
10d10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
10d20 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
10d30 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
10d40 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57  el *pLevel = &pW
10d50 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
10d60 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
10d70 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
10d80 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
10d90 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10da0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10db0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
10dc0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
10dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
10de0 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
10df0 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
10e00 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  WC);.  while( pW
10e10 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
10e20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
10e30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
10e40 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  s;.    pWInfo->p
10e50 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
10e60 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c  Loop;.    whereL
10e70 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
10e80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
10e90 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
10ea0 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  fo);.}../*.** Re
10eb0 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
10ec0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10ed0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
10ee0 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
10ef0 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
10f00 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
10f10 20 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65    (2)  X uses fe
10f20 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
10f30 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a   terms than Y.**
10f40 20 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48     (3)  Every WH
10f50 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10f60 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
10f70 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20  o used by Y.**  
10f80 20 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74   (4)  X skips at
10f90 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
10fa0 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20  olumns as Y.**  
10fb0 20 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20   (5)  If X is a 
10fc0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
10fd0 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a  than Y is too.**
10fe0 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28  .** Conditions (
10ff0 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20  2) and (3) mean 
11000 74 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f  that X is a "pro
11010 70 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59  per subset" of Y
11020 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  ..** If X is a p
11030 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11040 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
11050 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
11060 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
11070 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
11080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
11090 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
110a0 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
110b0 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
110c0 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
110d0 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
110e0 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a   Constraint (4).
110f0 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
11100 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
11110 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
11120 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
11130 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
11140 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
11150 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
11160 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20  er subset of Y. 
11170 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a   Constraint (5).
11180 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
11190 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20  ause a covering 
111a0 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64  index probably d
111b0 65 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20  eserves to have 
111c0 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20  a lower cost.** 
111d0 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  than a non-cover
111e0 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69  ing index even i
111f0 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
11200 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   subset..*/.stat
11210 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
11220 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
11230 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
11240 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
11250 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
11260 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
11270 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
11280 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
11290 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
112a0 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
112b0 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
112c0 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
112d0 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
112e0 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
112f0 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
11300 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
11310 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
11320 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
11330 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
11340 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
11350 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
11360 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
11370 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
11380 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
11390 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
113a0 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
113b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
113c0 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
113d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
113e0 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
113f0 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
11400 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
11410 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
11420 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
11430 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
11440 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
11450 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
11460 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
11470 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
11480 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
11490 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
114a0 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
114b0 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
114c0 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
114d0 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
114e0 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
114f0 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73   }.  if( (pX->ws
11500 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  Flags&WHERE_IDX_
11510 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20  ONLY)!=0 .   && 
11520 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pY->wsFlags&WHE
11530 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
11540 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
11550 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
11560 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  (5) */.  }.  ret
11570 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
11580 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
11590 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
115a0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
115b0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
115c0 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
115d0 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
115e0 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
115f0 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
11600 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
11610 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
11620 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
11630 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
11640 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
11650 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
11660 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
11670 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
11680 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
11690 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
116a0 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
116b0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
116c0 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
116d0 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
116e0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
116f0 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
11700 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
11710 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
11720 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
11730 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
11740 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
11750 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
11760 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
11770 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
11780 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
11790 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
117a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
117b0 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
117c0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
117d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
117e0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
117f0 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
11800 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
11810 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
11820 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
11830 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
11840 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
11850 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
11860 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11870 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11880 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11890 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
118a0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
118b0 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
118c0 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
118d0 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
118e0 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
118f0 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
11900 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11910 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
11920 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
11930 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
11940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11950 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11960 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11970 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11980 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
11990 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
119a0 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
119b0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
119c0 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
119d0 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
119e0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
119f0 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
11a00 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
11a10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
11a20 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
11a30 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
11a40 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
11a50 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
11a60 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
11a70 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11a80 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
11a90 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
11aa0 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
11ab0 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
11ac0 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ae0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11af0 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
11b00 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
11b10 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
11b20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
11b30 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
11b40 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
11b50 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
11b60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11b70 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
11b80 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
11b90 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
11ba0 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
11bb0 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70  at can be.** rep
11bc0 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61  laced by pTempla
11bd0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11be0 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61   NULL if pTempla
11bf0 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
11c00 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c  ng on the WhereL
11c10 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20  oop list..** In 
11c20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
11c30 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74  Template ought t
11c40 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  o be dropped fro
11c50 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
11c60 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
11c70 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
11c80 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
11c90 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20  te can replace, 
11ca0 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
11cb0 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
11cc0 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
11cd0 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
11ce0 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79  nnot replace any
11cf0 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
11d00 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
11d10 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
11d20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
11d30 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72  st as a new entr
11d40 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  y, then return a
11d50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
11d60 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  ** tail of the l
11d70 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
11d80 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
11d90 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
11da0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
11db0 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
11dc0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
11dd0 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
11de0 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
11df0 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
11e00 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
11e10 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
11e20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
11e30 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
11e40 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
11e50 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
11e60 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
11e70 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
11e80 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
11e90 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
11ea0 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
11eb0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
11ec0 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
11ed0 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
11ee0 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
11ef0 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
11f00 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
11f10 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
11f20 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
11f30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
11f40 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
11f50 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
11f60 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
11f70 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
11f80 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
11f90 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
11fa0 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
11fb0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
11fc0 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
11fd0 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
11fe0 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
11ff0 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
12000 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
12010 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
12020 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
12030 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
12040 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
12050 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
12060 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
12070 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
12080 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
12090 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
120a0 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
120b0 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
120c0 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
120d0 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
120e0 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
120f0 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
12100 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
12110 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
12120 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
12130 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
12140 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
12150 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
12160 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
12170 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
12180 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
12190 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
121a0 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
121b0 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
121c0 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
121d0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
121e0 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
121f0 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
12200 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
12210 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
12220 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
12230 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
12240 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
12250 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
12260 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
12270 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
12280 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
12290 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
122a0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
122b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
122c0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
122d0 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
122e0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
122f0 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
12300 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
12310 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
12320 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12330 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
12340 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
12350 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
12360 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
12370 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
12380 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
12390 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
123a0 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
123b0 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
123c0 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
123d0 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
123e0 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
123f0 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
12400 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
12410 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
12420 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
12430 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12440 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
12450 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
12460 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
12470 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
124a0 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
124b0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
124e0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
124f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
12520 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
12530 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
12540 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
12550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12560 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
12570 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
12580 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
12590 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
125a0 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
125b0 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
125c0 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
125d0 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
125e0 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
125f0 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12600 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
12610 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
12620 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
12630 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
12640 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
12650 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
12660 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12670 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12680 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12690 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
126a0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
126b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
126e0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
126f0 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
12700 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
12730 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
12740 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
12750 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12760 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
12770 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
12780 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
12790 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
127a0 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
127b0 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
127c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
127d0 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
127e0 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
127f0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
12800 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
12810 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
12820 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
12830 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
12840 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
12850 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
12860 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
12870 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
12880 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
12890 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
128a0 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
128b0 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
128c0 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
128d0 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
128e0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
128f0 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
12900 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
12910 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
12920 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
12930 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
12940 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
12950 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
12960 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
12970 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12980 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
12990 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
129a0 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
129b0 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
129c0 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
129d0 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
129e0 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
129f0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
12a00 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
12a10 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
12a20 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
12a30 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
12a40 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
12a50 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
12a60 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12a70 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
12a80 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
12a90 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
12aa0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
12ab0 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
12ac0 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
12ad0 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
12ae0 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
12af0 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
12b00 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
12b10 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
12b20 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
12b30 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
12b40 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
12b50 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
12b60 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
12b70 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
12b80 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
12b90 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
12ba0 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
12bb0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12bc0 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
12bd0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12be0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12bf0 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
12c00 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
12c10 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
12c20 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
12c30 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
12c40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12c50 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
12c60 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
12c70 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
12c80 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
12c90 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
12ca0 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
12cb0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12cc0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12cd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12ce0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
12cf0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
12d00 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
12d10 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
12d20 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
12d30 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
12d40 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
12d50 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
12d60 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
12d70 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69  rSet!=0 ){.    i
12d80 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  f( pTemplate->nL
12d90 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52  Term ){.#if WHER
12da0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
12db0 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75       u16 n = pBu
12dc0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e  ilder->pOrSet->n
12dd0 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a  ;.      int x =.
12de0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
12df0 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
12e00 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
12e10 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
12e20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
12e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
12e60 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
12e70 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12e80 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
12e90 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12ea0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12eb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12ec0 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
12ed0 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
12ee0 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
12ef0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12f00 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12f10 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12f20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
12f30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12f40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
12f50 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
12f60 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12f70 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
12f80 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
12f90 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
12fa0 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
12fb0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
12fc0 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
12fd0 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12fe0 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
12ff0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
13000 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
13010 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
13020 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
13030 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
13040 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
13050 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
13060 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
13070 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
13080 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
13090 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
130a0 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
130b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
130c0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
130d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
130e0 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29  ntf("   skip: ")
130f0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
13100 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
13110 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
13120 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13140 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a  _OK;  .  }else{.
13150 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b      p = *ppPrev;
13160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
13170 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
13180 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
13190 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
131a0 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
131b0 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
131c0 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
131d0 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
131e0 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
131f0 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
13200 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
13210 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
13220 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
13230 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
13240 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
13250 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
13260 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
13270 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
13280 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20  rintf("replace: 
13290 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
132a0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
132b0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
132c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
132d0 69 6e 74 66 28 22 20 20 20 77 69 74 68 3a 20 22  intf("   with: "
132e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
132f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
13300 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a  Printf("    add:
13310 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   ");.    }.    w
13320 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
13330 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
13340 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
13350 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
13360 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
13370 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
13380 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
13390 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
133a0 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
133b0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
133c0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
133d0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
133e0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
133f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13400 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
13410 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
13420 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
13430 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
13440 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
13450 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
13460 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
13470 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
13480 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
13490 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
134a0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
134b0 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
134c0 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
134d0 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
134e0 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
134f0 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
13500 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
13510 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
13520 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
13530 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
13540 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
13550 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
13560 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
13570 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
13580 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
13590 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
135a0 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
135b0 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
135c0 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
135d0 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
135e0 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
135f0 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
13600 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
13610 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
13620 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
13630 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
13640 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
13650 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
13660 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
13670 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
13680 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
13690 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
136a0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
136b0 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
136c0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
136d0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
136e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
136f0 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
13700 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
13710 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13720 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
13730 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
13740 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
13750 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
13760 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
13770 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
13780 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
13790 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
137a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
137b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
137c0 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
137d0 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
137e0 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
137f0 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
13800 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
13810 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
13820 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
13830 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
13840 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
13850 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
13860 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
13870 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
13880 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
13890 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
138a0 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
138b0 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
138c0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
138d0 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
138e0 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
138f0 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
13900 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
13910 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
13920 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
13930 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
13940 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
13950 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
13960 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
13970 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
13980 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
13990 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
139a0 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
139b0 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
139c0 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
139d0 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
139e0 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
139f0 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
13a00 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
13a10 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13a20 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
13a30 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
13a40 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
13a50 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
13a60 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
13a70 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
13a80 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13a90 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
13aa0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13ab0 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
13ac0 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
13ad0 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
13ae0 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
13af0 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
13b00 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
13b10 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
13b20 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
13b30 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
13b40 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
13b50 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
13b60 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
13b70 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
13b80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13b90 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
13ba0 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
13bb0 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
13bc0 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
13bd0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
13be0 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
13bf0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
13c00 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
13c10 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
13c20 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
13c30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
13c40 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
13c50 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
13c60 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
13c70 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
13c80 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
13c90 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
13ca0 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
13cb0 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
13cc0 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
13cd0 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
13ce0 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
13cf0 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
13d00 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
13d10 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
13d20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
13d30 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
13d40 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
13d50 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
13d60 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
13d70 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
13d80 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
13d90 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13da0 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
13db0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13dc0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13dd0 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
13de0 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
13df0 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
13e00 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
13e10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13e20 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
13e30 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
13e40 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13e50 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
13e60 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
13e70 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
13e80 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
13e90 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
13ea0 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
13eb0 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
13ec0 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
13ed0 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
13ee0 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
13ef0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
13f00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
13f10 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
13f20 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
13f30 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
13f40 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
13f50 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
13f60 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13f70 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
13f80 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
13f90 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13fa0 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
13fb0 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
13fc0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13fd0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
13fe0 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
13ff0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14000 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
14010 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
14020 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
14030 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
14040 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
14050 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14060 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
14070 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
14080 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
14090 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
140a0 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
140b0 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
140c0 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
140d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
140e0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
140f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
14100 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
14110 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
14120 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
14130 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
14140 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
14150 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
14160 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
14170 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
14180 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
14190 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
141a0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
141b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
141c0 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
141d0 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
141e0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
141f0 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
14200 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
14210 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
14220 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
14230 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
14240 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
14250 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
14260 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
14270 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
14280 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14290 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
142a0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
142b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
142c0 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
142d0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
142e0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
142f0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
14300 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
14310 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
14320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14330 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
14340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14350 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
14360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14370 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
14380 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
14390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
143b0 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
143c0 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
143d0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
143e0 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
143f0 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65  ./* .** Term pTe
14400 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72  rm is a vector r
14410 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ange comparison 
14420 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66  operation. The f
14430 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  irst comparison.
14440 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ** in the vector
14450 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
14460 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  d using column n
14470 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  Eq of the index.
14480 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
14490 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
144a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65  tal number of ve
144b0 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68  ctor elements th
144c0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
144d0 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
144e0 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
144f0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
14500 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
14510 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ry is:.**.**   W
14520 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28  HERE a = ? AND (
14530 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f  b, c, d) > (?, ?
14540 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74  , ?).**.** and t
14550 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  he index:.**.** 
14560 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e    CREATE INDEX .
14570 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20  .. ON (a, b, c, 
14580 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  d, e).**.** then
14590 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
145a0 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
145b0 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20  with nEq=1. The 
145c0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
145d0 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69  n.** this case i
145e0 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s 3..*/.static i
145f0 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65 63  nt whereRangeVec
14600 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20  torLen(.  Parse 
14610 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
14620 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
14630 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  t */.  int iCur,
14640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14650 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49  ursor open on pI
14660 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
14670 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx,         /* 
14680 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
14690 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75  used for a inequ
146a0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
146b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
146c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
146d0 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71  mber of prior eq
146e0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
146f0 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78  ts on same index
14700 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
14710 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68  *pTerm     /* Th
14720 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c  e vector inequal
14730 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ity constraint *
14740 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
14750 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
14760 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70  torSize(pTerm->p
14770 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
14780 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d  int i;..  nCmp =
14790 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78   MIN(nCmp, (pIdx
147a0 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29  ->nColumn - nEq)
147b0 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
147c0 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
147d0 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61  /* Test if compa
147e0 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d  rison i of pTerm
147f0 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   is compatible w
14800 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45  ith column (i+nE
14810 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  q) .    ** of th
14820 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c  e index. If not,
14830 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20   exit the loop. 
14840 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
14850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14860 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
14870 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  son affinity */.
14880 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
14890 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
148a0 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c    /* Indexed col
148b0 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f  umns affinity */
148c0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
148d0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
148e0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
148f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14900 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  nce */.    Expr 
14910 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pLhs = pTerm->p
14920 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
14930 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14940 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68 73  ;.    Expr *pRhs
14950 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
14960 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
14970 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45   pRhs->flags & E
14980 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
14990 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
149a0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
149b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
149c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
149d0 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78    pRhs = pRhs->x
149e0 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
149f0 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  pr;.    }..    /
14a00 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
14a10 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70   LHS of the comp
14a20 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
14a30 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  mn reference to.
14a40 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
14a50 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
14a60 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c  ight source tabl
14a70 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  e. And that the 
14a80 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65  sort.    ** orde
14a90 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  r of the index c
14aa0 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d  olumn is the sam
14ab0 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72  e as the sort or
14ac0 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  der of the.    *
14ad0 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78  * leftmost index
14ae0 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20   column.  */.   
14af0 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54   if( pLhs->op!=T
14b00 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c  K_COLUMN .     |
14b10 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d  | pLhs->iTable!=
14b20 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c  iCur .     || pL
14b30 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64  hs->iColumn!=pId
14b40 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45  x->aiColumn[i+nE
14b50 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78  q] .     || pIdx
14b60 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e  ->aSortOrder[i+n
14b70 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74  Eq]!=pIdx->aSort
14b80 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29  Order[nEq].    )
14b90 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
14ba0 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
14bb0 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  se( pLhs->iColum
14bc0 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20  n==XN_ROWID );. 
14bd0 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
14be0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14bf0 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70  pRhs, sqlite3Exp
14c00 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29  rAffinity(pLhs))
14c10 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 73  ;.    idxaff = s
14c20 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
14c30 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e  nAffinity(pIdx->
14c40 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43  pTable, pLhs->iC
14c50 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20  olumn);.    if( 
14c60 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62 72  aff!=idxaff ) br
14c70 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20  eak;..    pColl 
14c80 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
14c90 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
14ca0 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
14cb0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
14cc0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14cd0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14ce0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
14cf0 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  , pIdx->azColl[i
14d00 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a  +nEq]) ) break;.
14d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
14d20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
14d30 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68  the cost C by th
14d40 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65  e costMult facte
14d50 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  r T.  This only 
14d60 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d  occurs if.** com
14d70 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
14d80 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
14d90 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ULT.*/.#ifdef SQ
14da0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14db0 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70  MULT.# define Ap
14dc0 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14dd0 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23  r(C,T)  C += T.#
14de0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70  else.# define Ap
14df0 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14e00 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f  r(C,T).#endif../
14e10 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
14e20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
14e30 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
14e40 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
14e50 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70   the .** index p
14e60 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61  Index. Try to ma
14e70 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
14e80 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
14e90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14ea0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  , pBuilder->pNew
14eb0 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20  ->nOut contains 
14ec0 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
14ed0 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14ee0 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79  to be visited by
14ef0 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67   filtering using
14f00 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72   the nEq .** ter
14f10 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69  ms only. If it i
14f20 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73  s modified, this
14f30 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72   value is restor
14f40 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  ed before this .
14f50 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
14f60 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  rns..**.** If pP
14f70 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
14f80 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
14f90 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
14fa0 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
14fb0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
14fc0 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
14fd0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
14fe0 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
14ff0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
15000 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
15010 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
15020 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
15030 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15040 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
15050 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
15060 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
15070 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
15080 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15090 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
150a0 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
150b0 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150d0 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
150e0 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
150f0 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
15100 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
15110 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
15120 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
15130 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
15140 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
15150 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
15160 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15170 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15180 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15190 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
151a0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
151b0 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
151c0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
151d0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
151e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
151f0 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
15200 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15210 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
15220 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
15230 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
15240 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
15250 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
15260 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
15290 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
152a0 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
152b0 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
152c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
152d0 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
152e0 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
152f0 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
15300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
15310 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
15320 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
15330 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
15340 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
15350 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
15360 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
15370 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
15380 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
15390 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
153a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
153b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
153c0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 42  /.  u16 saved_nB
153d0 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tm;             
153e0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
153f0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
15400 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20  .btree.nBtm */. 
15410 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b   u16 saved_nTop;
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
15440 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
15450 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31  ree.nTop */.  u1
15460 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20  6 saved_nSkip;  
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15480 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15490 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a  of pNew->nSkip *
154a0 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
154b0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
154c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
154d0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
154e0 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
154f0 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
15500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15510 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
15520 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
15530 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15540 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
15550 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15560 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
15570 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15590 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
155a0 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
155b0 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
155c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
155d0 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
155e0 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
155f0 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
15600 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
15610 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
15620 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
15630 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
15640 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
15650 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15660 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15670 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57  _NOMEM_BKPT;.  W
15680 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
15690 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 42   ("BEGIN %s.addB
156a0 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71  treeIdx(%s), nEq
156b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
156d0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61  obe->pTable->zNa
156e0 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  me,pProbe->zName
156f0 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  , pNew->u.btree.
15700 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nEq));..  assert
15710 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15720 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
15730 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
15740 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
15750 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
15760 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
15770 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
15780 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
15790 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
157a0 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
157b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
157c0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
157d0 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a  tree.nBtm==0 );.
157e0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
157f0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
15800 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
15810 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
15820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
15830 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
15840 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
15850 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
15860 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
15870 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
15880 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
15890 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
158a0 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
158b0 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
158c0 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nBtm = pNew->u.
158d0 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61  btree.nBtm;.  sa
158e0 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d  ved_nTop = pNew-
158f0 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20  >u.btree.nTop;. 
15900 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
15910 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
15920 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
15930 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
15940 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
15950 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
15960 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
15970 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
15980 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
15990 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
159a0 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
159b0 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
159c0 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
159d0 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
15a00 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
15a10 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
15a20 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
15a30 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
15a40 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
15a50 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
15a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15a70 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
15a80 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
15a90 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
15aa0 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
15ab0 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
15ac0 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
15ad0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
15ae0 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
15af0 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
15b00 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
15b10 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
15b20 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
15b30 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
15b40 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
15b50 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
15b60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15b70 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
15b80 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
15b90 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15ba0 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
15bb0 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
15bc0 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
15bd0 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
15be0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
15bf0 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
15c00 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
15c10 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
15c20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
15c30 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
15c40 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
15c50 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
15c60 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
15c70 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
15c80 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
15c90 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
15ca0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15cb0 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
15cc0 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
15cd0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
15ce0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
15cf0 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
15d00 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
15d10 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
15d20 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
15d30 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
15d40 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
15d50 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
15d60 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
15d70 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
15d80 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
15d90 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  low constraints 
15da0 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63  from the WHERE c
15db0 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
15dc0 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   by the.    ** r
15dd0 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
15de0 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79  LEFT JOIN.  Only
15df0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
15e00 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 61 72  the ON clause ar
15e10 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  e.    ** allowed
15e20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 72   */.    if( (pSr
15e30 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  c->fg.jointype &
15e40 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
15e50 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
15e60 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
15e70 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
15e80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
15e90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
15ea0 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49     if( IsUniqueI
15eb0 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26 26 20  ndex(pProbe) && 
15ec0 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
15ed0 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29 7b 0a  e->nKeyCol-1 ){.
15ee0 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
15ef0 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  bldFlags |= SQLI
15f00 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45 3b 0a  TE_BLDF_UNIQUE;.
15f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15f20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
15f30 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
15f40 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  DF_INDEXED;.    
15f50 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  }.    pNew->wsFl
15f60 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15f70 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
15f80 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15f90 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15fa0 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
15fb0 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 20   saved_nBtm;.   
15fc0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15fd0 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
15fe0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
15ff0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
16000 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
16010 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
16020 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
16030 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
16040 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
16050 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
16060 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
16070 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
16080 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
16090 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
160a0 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
160b0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20  ->maskSelf;..   
160c0 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d   assert( nInMul=
160d0 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  =0.        || (p
160e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
160f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
16100 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
16110 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
16120 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
16130 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  N)!=0 .        |
16140 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
16150 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
16160 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20  N)!=0 .    );.. 
16170 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
16180 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
16190 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
161a0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
161b0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
161c0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
161d0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
161e0 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
161f0 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
16200 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
16210 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
16220 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
16230 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36          nIn = 46
16240 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
16250 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
16260 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   );..        /* 
16270 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
16280 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6f  ay actually be o
16290 66 20 74 68 65 20 66 6f 72 6d 20 28 78 2c 20 79  f the form (x, y
162a0 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29  ) IN (SELECT...)
162b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
162c0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
162d0 69 73 20 61 20 73 65 70 61 72 61 74 65 20 74 65  is a separate te
162e0 72 6d 20 66 6f 72 20 65 61 63 68 20 6f 66 20 28  rm for each of (
162f0 78 29 20 61 6e 64 20 28 79 29 2e 0a 20 20 20 20  x) and (y)..    
16300 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20      ** However, 
16310 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70 6c 69  the nIn multipli
16320 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  er should only b
16330 65 20 61 70 70 6c 69 65 64 20 6f 6e 63 65 2c 20  e applied once, 
16340 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20 20 20  not once.       
16350 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 73 75 63   ** for each suc
16360 68 20 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c  h term. The foll
16370 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65 63 6b  owing loop check
16380 73 20 74 68 61 74 20 70 54 65 72 6d 20 69 73 20  s that pTerm is 
16390 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
163a0 69 72 73 74 20 73 75 63 68 20 74 65 72 6d 20 69  irst such term i
163b0 6e 20 75 73 65 2c 20 61 6e 64 20 73 65 74 73 20  n use, and sets 
163c0 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30 20 69 66  nIn back to 0 if
163d0 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20   it is not. */. 
163e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
163f0 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 31  i<pNew->nLTerm-1
16400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16410 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65    if( pNew->aLTe
16420 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d 3e 61  rm[i] && pNew->a
16430 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
16440 3d 70 45 78 70 72 20 29 20 6e 49 6e 20 3d 20 30  =pExpr ) nIn = 0
16450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16460 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
16470 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
16480 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
16490 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
164a0 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
164b0 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
164c0 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
164d0 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
164e0 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
164f0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
16500 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e      assert( nIn>
16510 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77  0 );  /* RHS alw
16520 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72  ays has 2 or mor
16530 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20  e terms...  The 
16540 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20  parser.         
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16560 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49   ** changes "x I
16570 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f  N (?)" into "x=?
16580 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ". */.      }.  
16590 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
165a0 68 61 73 53 74 61 74 31 20 29 7b 0a 20 20 20 20  hasStat1 ){.    
165b0 20 20 20 20 4c 6f 67 45 73 74 20 4d 2c 20 6c 6f      LogEst M, lo
165c0 67 4b 2c 20 73 61 66 65 74 79 4d 61 72 67 69 6e  gK, safetyMargin
165d0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 74  ;.        /* Let
165e0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4e  :.        **   N
165f0 20 3d 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d   = the total num
16600 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
16610 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
16620 20 2a 2a 20 20 20 4b 20 3d 20 74 68 65 20 6e 75   **   K = the nu
16630 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
16640 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
16650 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20  e IN operator.  
16660 20 20 20 20 20 20 2a 2a 20 20 20 4d 20 3d 20 74        **   M = t
16670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16680 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
16690 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 73 20  hat match terms 
166a0 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
166b0 2a 2a 20 20 20 20 20 20 20 74 6f 20 74 68 65 20  **       to the 
166c0 6c 65 66 74 20 69 6e 20 74 68 65 20 73 61 6d 65  left in the same
166d0 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
166e0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  IN operator is o
166f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  n.        **    
16700 20 20 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74     the left-most
16710 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2c 20 4d   index column, M
16720 3d 3d 4e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ==N..        **.
16730 20 20 20 20 20 20 20 20 2a 2a 20 47 69 76 65 6e          ** Given
16740 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
16750 20 61 62 6f 76 65 2c 20 69 74 20 69 73 20 62 65   above, it is be
16760 74 74 65 72 20 74 6f 20 6f 6d 69 74 20 74 68 65  tter to omit the
16770 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20   IN operator.   
16780 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
16790 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 61 6e   index lookup an
167a0 64 20 69 6e 73 74 65 61 64 20 64 6f 20 61 20 73  d instead do a s
167b0 63 61 6e 20 6f 66 20 74 68 65 20 4d 20 65 6c 65  can of the M ele
167c0 6d 65 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  ments,.        *
167d0 2a 20 74 65 73 74 69 6e 67 20 65 61 63 68 20 73  * testing each s
167e0 63 61 6e 6e 65 64 20 72 6f 77 20 61 67 61 69 6e  canned row again
167f0 73 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  st the IN operat
16800 6f 72 20 73 65 70 61 72 61 74 65 6c 79 2c 20 69  or separately, i
16810 66 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  f:.        **.  
16820 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16830 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b 2a 6c 6f 67  M*log(K) < K*log
16840 28 4e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  (N).        **. 
16850 20 20 20 20 20 20 20 2a 2a 20 4f 75 72 20 65 73         ** Our es
16860 74 69 6d 61 74 65 73 20 66 6f 72 20 4d 2c 20 4b  timates for M, K
16870 2c 20 61 6e 64 20 4e 20 6d 69 67 68 74 20 62 65  , and N might be
16880 20 69 6e 61 63 63 75 72 61 74 65 2c 20 73 6f 20   inaccurate, so 
16890 77 65 20 62 75 69 6c 64 20 69 6e 0a 20 20 20 20  we build in.    
168a0 20 20 20 20 2a 2a 20 61 20 73 61 66 65 74 79 20      ** a safety 
168b0 6d 61 72 67 69 6e 20 6f 66 20 32 20 28 4c 6f 67  margin of 2 (Log
168c0 45 73 74 3a 20 31 30 29 20 74 68 61 74 20 66 61  Est: 10) that fa
168d0 76 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 49  vors using the I
168e0 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 20  N operator.     
168f0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 69     ** with the i
16900 6e 64 65 78 2c 20 61 73 20 75 73 69 6e 67 20 61  ndex, as using a
16910 6e 20 69 6e 64 65 78 20 68 61 73 20 62 65 74 74  n index has bett
16920 65 72 20 77 6f 72 73 74 2d 63 61 73 65 20 62 65  er worst-case be
16930 68 61 76 69 6f 72 2e 0a 20 20 20 20 20 20 20 20  havior..        
16940 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
16950 68 61 76 65 20 72 65 61 6c 20 73 71 6c 69 74 65  have real sqlite
16960 5f 73 74 61 74 31 20 64 61 74 61 2c 20 61 6c 77  _stat1 data, alw
16970 61 79 73 20 70 72 65 66 65 72 20 74 6f 20 75 73  ays prefer to us
16980 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
16990 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
169a0 2a 2f 0a 20 20 20 20 20 20 20 20 4d 20 3d 20 70  */.        M = p
169b0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
169c0 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20  st[saved_nEq];. 
169d0 20 20 20 20 20 20 20 6c 6f 67 4b 20 3d 20 65 73         logK = es
169e0 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20 20 20 20 20  tLog(nIn);.     
169f0 20 20 20 73 61 66 65 74 79 4d 61 72 67 69 6e 20     safetyMargin 
16a00 3d 20 31 30 3b 20 20 2f 2a 20 54 55 4e 49 4e 47  = 10;  /* TUNING
16a10 3a 20 65 78 74 72 61 20 77 65 69 67 68 74 20 66  : extra weight f
16a20 6f 72 20 69 6e 64 65 78 65 64 20 49 4e 20 2a 2f  or indexed IN */
16a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 20 2b  .        if( M +
16a40 20 6c 6f 67 4b 20 2b 20 73 61 66 65 74 79 4d 61   logK + safetyMa
16a50 72 67 69 6e 20 3c 20 6e 49 6e 20 2b 20 72 4c 6f  rgin < nIn + rLo
16a60 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
16a70 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
16a80 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  40,.            
16a90 28 22 53 63 61 6e 20 70 72 65 66 65 72 72 65 64  ("Scan preferred
16aa0 20 6f 76 65 72 20 49 4e 20 6f 70 65 72 61 74 6f   over IN operato
16ab0 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f  r on column %d o
16ac0 66 20 5c 22 25 73 5c 22 20 28 25 64 3c 25 64 29  f \"%s\" (%d<%d)
16ad0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16ae0 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50 72    saved_nEq, pPr
16af0 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f  obe->zName, M+lo
16b00 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53  gK+10, nIn+rLogS
16b10 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ize));.         
16b20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b40 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
16b50 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x40,.           
16b60 20 28 22 49 4e 20 6f 70 65 72 61 74 6f 72 20 70   ("IN operator p
16b70 72 65 66 65 72 72 65 64 20 6f 6e 20 63 6f 6c 75  referred on colu
16b80 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22 20  mn %d of \"%s\" 
16b90 28 25 64 3e 3d 25 64 29 5c 6e 22 2c 0a 20 20 20  (%d>=%d)\n",.   
16ba0 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 5f            saved_
16bb0 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  nEq, pProbe->zNa
16bc0 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e  me, M+logK+10, n
16bd0 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a 20  In+rLogSize));. 
16be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16bf0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
16c00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
16c10 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 7d 65 6c  LUMN_IN;.    }el
16c20 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f  se if( eOp & (WO
16c30 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20  _EQ|WO_IS) ){.  
16c40 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
16c50 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
16c60 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20  saved_nEq];.    
16c70 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
16c80 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
16c90 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  EQ;.      assert
16ca0 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65  ( saved_nEq==pNe
16cb0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  w->u.btree.nEq )
16cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
16cd0 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20  ==XN_ROWID .    
16ce0 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26     || (iCol>=0 &
16cf0 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73  & nInMul==0 && s
16d00 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65  aved_nEq==pProbe
16d10 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20  ->nKeyCol-1).   
16d20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66     ){.        if
16d30 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
16d40 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71   || pProbe->uniq
16d50 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20 20 20 20 20  NotNull .       
16d60 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6e 4b    || (pProbe->nK
16d70 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 50 72 6f  eyCol==1 && pPro
16d80 62 65 2d 3e 6f 6e 45 72 72 6f 72 20 26 26 20 65  be->onError && e
16d90 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a 20 20 20 20  Op==WO_EQ) .    
16da0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
16db0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
16dc0 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
16dd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16de0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
16df0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
16e00 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
16e10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16e20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
16e30 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
16e40 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16e50 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
16e60 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  MN_NULL;.    }el
16e70 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f  se if( eOp & (WO
16e80 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
16e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
16ea0 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20  p & WO_GT );.   
16eb0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
16ec0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
16ed0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
16ee0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
16ef0 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
16f00 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65  LIMIT;.      pNe
16f10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
16f20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74  = whereRangeVect
16f30 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20  orLen(.         
16f40 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69   pParse, pSrc->i
16f50 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20  Cursor, pProbe, 
16f60 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d  saved_nEq, pTerm
16f70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
16f80 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
16f90 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
16fa0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
16fb0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
16fc0 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20  KEOPT ){.       
16fd0 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61   /* Range contra
16fe0 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66  ints that come f
16ff0 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  rom the LIKE opt
17000 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20  imization are.  
17010 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
17020 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a  used in pairs. *
17030 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d  /.        pTop =
17040 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20   &pTerm[1];.    
17050 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 6f      assert( (pTo
17060 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  p-(pTerm->pWC->a
17070 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e  ))<pTerm->pWC->n
17080 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Term );.        
17090 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74  assert( pTop->wt
170a0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
170b0 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20  EOPT );.        
170c0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f  assert( pTop->eO
170d0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29  perator==WO_LT )
170e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  ;.        if( wh
170f0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
17100 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
17110 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
17120 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20   /* OOM */.     
17130 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
17140 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
17150 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  = pTop;.        
17160 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
17170 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
17180 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17190 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31  u.btree.nTop = 1
171a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
171b0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
171c0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c  t( eOp & (WO_LT|
171d0 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20  WO_LE) );.      
171e0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
171f0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
17200 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
17210 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_LE );.      pN
17220 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
17230 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
17240 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  E|WHERE_TOP_LIMI
17250 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  T;.      pNew->u
17260 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68  .btree.nTop = wh
17270 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65  ereRangeVectorLe
17280 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  n(.          pPa
17290 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  rse, pSrc->iCurs
172a0 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65  or, pProbe, save
172b0 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20  d_nEq, pTerm.   
172c0 20 20 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70     );.      pTop
172d0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
172e0 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
172f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
17300 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
17330 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
17340 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
17350 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
17360 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
17370 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
17380 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
17390 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
173a0 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
173b0 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
173c0 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
173d0 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
173e0 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
173f0 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
17400 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
17410 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
17420 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
17430 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
17440 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
17450 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
17460 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
17470 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
17480 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
17490 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
174a0 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
174b0 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
174c0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
174d0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
174e0 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
174f0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
17500 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
17510 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
17520 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
17530 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
17540 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
17550 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
17560 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
17570 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
17580 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
17590 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
175a0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
175b0 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
175c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
175d0 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
175e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
175f0 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
17600 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
17610 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  L|WO_EQ|WO_IN|WO
17620 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61  _IS) );..      a
17630 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
17640 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
17650 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
17660 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26  ->truthProb<=0 &
17670 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  & pProbe->aiColu
17680 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30  mn[saved_nEq]>=0
17690 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
176a0 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e  rt( (eOp & WO_IN
176b0 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20  ) || nIn==0 );. 
176c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
176d0 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a   eOp & WO_IN );.
176e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
176f0 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
17700 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
17710 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
17720 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
17730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17740 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
17750 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77  AT4.        tRow
17760 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
17770 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c        if( nInMul
17780 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
17790 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
177a0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e   .         && pN
177b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
177c0 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
177d0 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  Col.         && 
177e0 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d  ((eOp & WO_IN)==
177f0 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  0 || !ExprHasPro
17800 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
17810 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17820 29 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  )).         && O
17830 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
17840 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
17850 61 74 33 34 29 0a 20 20 20 20 20 20 20 20 29 7b  at34).        ){
17860 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
17870 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
17880 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
17890 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
178a0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
178b0 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
178c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
178d0 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
178e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
178f0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
17900 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
17910 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
17920 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
17930 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
17940 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
17950 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
17960 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
17970 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
17980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17990 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
179a0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
179b0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
179c0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
179d0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
179e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
179f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
17a00 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
17a10 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
17a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17a30 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
17a40 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
17a50 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
17a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
17a70 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
17a80 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
17a90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17aa0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
17ab0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
17ac0 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
17ad0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
17ae0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
17af0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
17b00 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
17b10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17b20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
17b30 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
17b40 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
17b50 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
17b60 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
17b70 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
17b80 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
17b90 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
17ba0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
17bb0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
17bc0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
17bd0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
17be0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
17bf0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
17c00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
17c10 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
17c20 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
17c30 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
17c40 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
17c50 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
17c60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
17c70 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
17c80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17ca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
17cb0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
17cc0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
17cd0 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
17ce0 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
17cf0 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
17d00 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
17d10 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
17d20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
17d30 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
17d40 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
17d50 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
17d60 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
17d70 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
17d80 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
17d90 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
17da0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
17db0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
17dc0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
17dd0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
17de0 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
17df0 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
17e00 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
17e10 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
17e20 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
17e30 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
17e40 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
17e50 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
17e60 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
17e70 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
17e80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17e90 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
17ea0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
17eb0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
17ec0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
17ed0 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
17ee0 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
17ef0 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
17f00 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
17f10 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
17f20 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
17f30 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
17f40 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
17f50 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
17f60 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
17f70 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
17f80 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
17f90 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
17fa0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
17fb0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
17fc0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
17fd0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
17fe0 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
17ff0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
18000 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
18010 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
18020 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
18030 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
18040 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
18050 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
18060 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
18070 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18080 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
18090 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
180a0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
180b0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
180c0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
180d0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
180e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
180f0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
18100 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18110 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
18120 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
18130 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
18140 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
18150 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
18160 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
18170 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
18180 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
18190 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
181a0 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
181b0 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  tm;.  pNew->u.bt
181c0 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64  ree.nTop = saved
181d0 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nTop;.  pNew->n
181e0 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
181f0 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ip;.  pNew->wsFl
18200 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
18210 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  ags;.  pNew->nOu
18220 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
18230 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
18240 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a   saved_nLTerm;..
18250 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
18260 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
18270 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
18280 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
18290 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
182a0 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
182b0 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
182c0 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
182d0 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
182e0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
182f0 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
18300 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
18310 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a  s at least 18. .
18320 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    **.  ** The ma
18330 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73  gic number 18 is
18340 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65   selected on the
18350 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e   basis that scan
18360 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a  ning 17 rows.  *
18370 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  * is almost alwa
18380 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20  ys quicker than 
18390 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65  an index seek (e
183a0 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68  ven though if th
183b0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e  e index.  ** con
183c0 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
183d0 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73   2^17 rows we as
183e0 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69  sume otherwise i
183f0 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66  n other parts of
18400 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e  .  ** the code).
18410 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74   And, even if it
18420 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75   is not, it shou
18430 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75  ld not be too mu
18440 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a  ch slower. .  **
18450 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
18460 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65  nd, the extra se
18470 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70  eks could end up
18480 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61   being significa
18490 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65  ntly.  ** more e
184a0 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20  xpensive.  */.  
184b0 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69  assert( 42==sqli
184c0 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b  te3LogEst(18) );
184d0 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71  .  if( saved_nEq
184e0 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
184f0 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
18500 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
18510 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f     && pProbe->no
18520 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26  SkipScan==0.   &
18530 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
18540 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
18550 5f 53 6b 69 70 53 63 61 6e 29 0a 20 20 20 26 26  _SkipScan).   &&
18560 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
18570 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  gEst[saved_nEq+1
18580 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47  ]>=42  /* TUNING
18590 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b  : Minimum for sk
185a0 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26  ip-scan */.   &&
185b0 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70   (rc = whereLoop
185c0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
185d0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
185e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )==SQLITE_OK.  )
185f0 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74  {.    LogEst nIt
18600 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  er;.    pNew->u.
18610 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
18620 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a   pNew->nSkip++;.
18630 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
18640 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
18650 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18660 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
18670 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e  _SKIPSCAN;.    n
18680 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Iter = pProbe->a
18690 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
186a0 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  _nEq] - pProbe->
186b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
186c0 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e  d_nEq+1];.    pN
186d0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65  ew->nOut -= nIte
186e0 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  r;.    /* TUNING
186f0 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72  :  Because uncer
18700 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20  tainties in the 
18710 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b  estimates for sk
18720 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c  ip-scan queries,
18730 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e  .    ** add a 1.
18740 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72  375 fudge factor
18750 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63   to make skip-sc
18760 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73  an slightly less
18770 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20   likely. */.    
18780 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20  nIter += 5;.    
18790 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
187a0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
187b0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
187c0 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a  Iter + nInMul);.
187d0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
187e0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
187f0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18800 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
18810 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
18820 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
18830 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
18840 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
18850 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54 52  ;.  }..  WHERETR
18860 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44  ACE(0x800, ("END
18870 20 25 73 2e 61 64 64 42 74 72 65 65 49 64 78 28   %s.addBtreeIdx(
18880 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d  %s), nEq=%d, rc=
18890 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
188b0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61  obe->pTable->zNa
188c0 6d 65 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  me, pProbe->zNam
188d0 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 72 63  e, saved_nEq, rc
188e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
188f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18900 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
18910 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
18920 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
18930 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
18940 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
18950 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
18960 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
18970 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
18980 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
18990 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
189a0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
189b0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
189c0 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
189d0 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
189e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
189f0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
18a00 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
18a10 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
18a20 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
18a30 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
18a40 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
18a50 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
18a60 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
18a70 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
18a80 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45   ExprList *aColE
18a90 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  xpr;.  int ii, j
18aa0 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
18ab0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
18ac0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
18ad0 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
18ae0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
18af0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
18b00 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
18b10 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
18b20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
18b30 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
18b40 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
18b50 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
18b60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
18b70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
18b80 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
18b90 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69  ursor ){.      i
18ba0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
18bb0 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
18bc0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
18bd0 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
18be0 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
18bf0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
18c00 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
18c10 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
18c20 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
18c30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61      }else if( (a
18c40 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78  ColExpr = pIndex
18c50 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29  ->aColExpr)!=0 )
18c60 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  {.      for(jj=0
18c70 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
18c80 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
18c90 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
18ca0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58  >aiColumn[jj]!=X
18cb0 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75  N_EXPR ) continu
18cc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
18cd0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
18ce0 65 53 6b 69 70 28 70 45 78 70 72 2c 61 43 6f 6c  eSkip(pExpr,aCol
18cf0 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70  Expr->a[jj].pExp
18d00 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20 29 7b  r,iCursor)==0 ){
18d10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18d20 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
18d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18d40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18d50 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
18d60 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
18d70 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
18d80 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
18d90 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
18da0 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
18db0 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
18dc0 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
18dd0 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
18de0 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
18df0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
18e00 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
18e10 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
18e20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
18e30 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
18e40 70 54 65 72 6d 3b 0a 20 20 50 61 72 73 65 20 2a  pTerm;.  Parse *
18e50 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57  pParse = pWC->pW
18e60 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
18e70 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
18e80 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
18e90 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62 6c   if( !whereUsabl
18ea0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 54  ePartialIndex(iT
18eb0 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e 70  ab,pWC,pWhere->p
18ec0 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
18ed0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
18ee0 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20  Where->pRight;. 
18ef0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
18f00 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
18f10 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20 29  ITE_EnableQPSG )
18f20 20 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 66   pParse = 0;.  f
18f30 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
18f40 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
18f50 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
18f60 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
18f70 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
18f80 72 3b 0a 20 20 20 20 69 66 28 20 28 21 45 78 70  r;.    if( (!Exp
18f90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18fa0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
18fb0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
18fc0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
18fd0 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
18fe0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
18ff0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19000 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20  pWhere, iTab) . 
19010 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
19020 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
19030 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19040 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
19050 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
19060 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  or a single tabl
19070 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68  e of the join wh
19080 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
19090 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
190a0 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
190b0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
190c0 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
190d0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
190e0 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
190f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
19100 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20  **.** The costs 
19110 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29  (WhereLoop.rRun)
19120 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c   of the b-tree l
19130 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68  oops added by th
19140 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
19150 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  re calculated as
19160 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
19170 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c  For a full scan,
19180 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61   assuming the ta
19190 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63  ble (or index) c
191a0 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77  ontains nRow row
191b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  s:.**.**     cos
191c0 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20  t = nRow * 3.0  
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20    // full-table 
191f0 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74  scan.**     cost
19200 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20   = nRow * K     
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65   // scan of cove
19230 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
19240 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
19250 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20  (K+3.0)         
19260 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
19270 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  f non-covering i
19280 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ndex.**.** where
19290 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65   K is a value be
192a0 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
192b0 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74  0 set based on t
192c0 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20  he relative .** 
192d0 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67  estimated averag
192e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
192f0 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65  dex and table re
19300 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  cords..**.** For
19310 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
19320 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20  where nVisit is 
19330 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
19340 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64  dex rows visited
19350 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c  .** by the scan,
19360 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68   and nSeek is th
19370 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b  e number of seek
19380 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
19390 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  ired on .** the 
193a0 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a  index b-tree:.**
193b0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
193c0 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
193d0 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20  ) + K * nVisit) 
193e0 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65           // cove
193f0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
19400 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
19410 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b   (log(nRow) + (K
19420 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20  +3.0) * nVisit) 
19430 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69     // non-coveri
19440 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e  ng index.**.** N
19450 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69  ormally, nSeek i
19460 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65  s 1. nSeek value
19470 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  s greater than 1
19480 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74   come about if t
19490 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  he .** WHERE cla
194a0 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20  use includes "x 
194b0 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73  IN (....)" terms
194c0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
194d0 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e  f "x=?". Or when
194e0 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78   .** implicit "x
194f0 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
19500 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61  OM tbl)" terms a
19510 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69  re added for ski
19520 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  p-scans..**.** T
19530 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c  he estimated val
19540 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69  ues (nRow, nVisi
19550 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20  t, nSeek) often 
19560 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20  contain a large 
19570 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63  amount.** of unc
19580 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74  ertainty.  For t
19590 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72  his reason, scor
195a0 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20  ing is designed 
195b0 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68  to pick plans th
195c0 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65  at.** "do the le
195d0 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65  ast harm" if the
195e0 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69   estimates are i
195f0 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20  naccurate.  For 
19600 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f  example, a.** lo
19610 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69  g(nRow) factor i
19620 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61  s omitted from a
19630 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
19640 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65  dex scan in orde
19650 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65  r to.** bias the
19660 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f   scoring in favo
19670 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  r of using an in
19680 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77  dex, since the w
19690 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72  orst-case.** per
196a0 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e  formance of usin
196b0 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61  g an index is fa
196c0 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  r better than th
196d0 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72  e worst-case per
196e0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61  formance.** of a
196f0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
19700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19710 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
19720 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
19730 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
19740 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
19750 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
19760 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
19770 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  q             /*
19780 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
19790 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
197a0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
197b0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
197c0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
197d0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
197e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
197f0 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
19800 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
19810 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
19820 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
19830 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
19840 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
19850 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
19860 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
19870 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61  ey */.  LogEst a
19880 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
19890 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
198a0 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  LogEst[] value f
198b0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
198c0 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
198d0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
198e0 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
198f0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
19900 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
19910 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
19920 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
19930 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
19940 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
19950 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
19960 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
19970 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
19980 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
19990 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
199a0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
199b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
199c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
199d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
199e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
199f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
19a00 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
19a10 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
19a20 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
19a50 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
19a60 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
19a70 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
19a80 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
19a90 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
19aa0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
19ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
19ac0 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
19ad0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
19ae0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
19af0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
19b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19b10 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
19b20 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
19b30 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
19b40 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
19b50 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
19b60 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
19b70 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
19b80 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
19b90 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
19ba0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
19bb0 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
19bc0 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
19bd0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
19be0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
19bf0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
19c00 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
19c10 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
19c20 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
19c30 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  ( pSrc->pIBIndex
19c40 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
19c50 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
19c60 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
19c70 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
19c80 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
19c90 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64  e = pSrc->pIBInd
19ca0 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
19cb0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
19cc0 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
19cd0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
19ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
19cf0 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
19d00 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
19d10 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
19d20 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
19d30 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
19d40 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
19d50 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
19d60 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
19d70 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
19d80 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
19d90 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
19da0 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
19db0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
19dc0 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
19dd0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
19de0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
19df0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
19e00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
19e10 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
19e20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
19e30 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
19e40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
19e50 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
19e60 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
19e70 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
19e80 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
19e90 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
19ea0 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45     sPk.aiRowLogE
19eb0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
19ec0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
19ed0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
19ee0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
19ef0 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a  pTab;.    sPk.sz
19f00 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73  IdxRow = pTab->s
19f10 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52  zTabRow;.    aiR
19f20 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
19f30 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
19f40 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
19f50 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74   = 0;.    pFirst
19f60 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
19f70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
19f80 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
19f90 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
19fa0 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
19fb0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
19fc0 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
19fd0 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
19fe0 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
19ff0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
1a000 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
1a010 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1a020 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
1a030 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
1a040 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
1a050 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54    }.  rSize = pT
1a060 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
1a070 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
1a080 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66  Log(rSize);..#if
1a090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a0a0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
1a0b0 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
1a0c0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
1a0d0 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53   !pBuilder->pOrS
1a0e0 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  et      /* Not p
1a0f0 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74  art of an OR opt
1a100 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  imization */.   
1a110 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1a120 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1a130 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a  R_SUBCLAUSE)==0.
1a140 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70     && (pWInfo->p
1a150 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1a160 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
1a170 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53  dex)!=0.   && pS
1a180 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20  rc->pIBIndex==0 
1a190 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49       /* Has no I
1a1a0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1a1b0 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
1a1c0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20  >fg.notIndexed  
1a1d0 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49   /* Has no NOT I
1a1e0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f  NDEXED clause */
1a1f0 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28  .   && HasRowid(
1a200 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a  pTab)         /*
1a210 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57   Not WITHOUT ROW
1a220 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45  ID table. (FIXME
1a230 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20  : Why not?) */. 
1a240 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69    && !pSrc->fg.i
1a250 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e  sCorrelated /* N
1a260 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
1a270 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26  subquery */.   &
1a280 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65  & !pSrc->fg.isRe
1a290 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20  cursive  /* Not 
1a2a0 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d  a recursive comm
1a2b0 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
1a2c0 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  ion. */.  ){.   
1a2d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
1a2e0 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
1a2f0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
1a300 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
1a310 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
1a320 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1a330 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
1a340 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
1a350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a360 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
1a370 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
1a380 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
1a390 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
1a3a0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
1a3b0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
1a3c0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
1a3d0 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
1a3e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
1a3f0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
1a400 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53          pNew->nS
1a410 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  kip = 0;.       
1a420 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
1a430 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
1a440 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1a450 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
1a460 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
1a470 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
1a480 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
1a490 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
1a4a0 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
1a4b0 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
1a4c0 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64      ** estimated
1a4d0 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28   to be X*N*log2(
1a4e0 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
1a4f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1a500 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
1a510 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
1a520 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65  ndexed and where
1a530 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d   X is 7 (LogEst=
1a540 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20  28) for normal. 
1a550 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
1a560 20 6f 72 20 30 2e 35 20 28 4c 6f 67 45 73 74 3d   or 0.5 (LogEst=
1a570 2d 31 30 29 20 66 6f 72 20 76 69 65 77 73 20 61  -10) for views a
1a580 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  nd subqueries.  
1a590 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  The value.      
1a5a0 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61    ** of X is sma
1a5b0 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61  ller for views a
1a5c0 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f  nd subqueries so
1a5d0 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
1a5e0 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20  planner.        
1a5f0 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ** will be more 
1a600 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74  aggressive about
1a610 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f   generating auto
1a620 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f  matic indexes fo
1a630 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  r.        ** tho
1a640 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63  se objects, sinc
1a650 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  e there is no op
1a660 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64  portunity to add
1a670 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20   schema.        
1a680 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75  ** indexes on su
1a690 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65  bqueries and vie
1a6a0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ws. */.        p
1a6b0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c  New->rSetup = rL
1a6c0 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 3b 0a  ogSize + rSize;.
1a6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
1a6e0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
1a6f0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1a700 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
1a710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a720 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20  pNew->rSetup += 
1a730 32 38 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  28;.        }els
1a740 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
1a750 77 2d 3e 72 53 65 74 75 70 20 2d 3d 20 31 30 3b  w->rSetup -= 10;
1a760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a770 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
1a780 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
1a790 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
1a7a0 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ult);.        if
1a7b0 28 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30  ( pNew->rSetup<0
1a7c0 20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20   ) pNew->rSetup 
1a7d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
1a7e0 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64  TUNING: Each ind
1a7f0 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73  ex lookup yields
1a800 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20   20 rows in the 
1a810 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20  table.  This.   
1a820 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20       ** is more 
1a830 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67  than the usual g
1a840 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c  uess of 10 rows,
1a850 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e   since we have n
1a860 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  o way.        **
1a870 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20   of knowing how 
1a880 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e  selective the in
1a890 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  dex will ultimat
1a8a0 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c  ely be.  It woul
1a8b0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  d.        ** not
1a8c0 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65   be unreasonable
1a8d0 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61   to make this va
1a8e0 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e  lue much larger.
1a8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1a900 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73  ->nOut = 43;  as
1a910 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65  sert( 43==sqlite
1a920 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20  3LogEst(20) );. 
1a930 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1a940 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1a950 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e  tAdd(rLogSize,pN
1a960 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  ew->nOut);.     
1a970 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1a980 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   = WHERE_AUTO_IN
1a990 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
1a9a0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
1a9b0 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
1a9c0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1a9d0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1a9e0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1a9f0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
1aa00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1aa10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1aa20 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
1aa30 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
1aa40 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20  er all indices. 
1aa50 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  If there was an 
1aa60 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1aa70 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 0a 20 20  e, then only .  
1aa80 2a 2a 20 63 6f 6e 73 69 64 65 72 20 69 6e 64 65  ** consider inde
1aa90 78 20 70 50 72 6f 62 65 2e 20 20 2a 2f 0a 20 20  x pProbe.  */.  
1aaa0 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
1aab0 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 0a  _OK && pProbe; .
1aac0 20 20 20 20 20 20 70 50 72 6f 62 65 3d 28 70 53        pProbe=(pS
1aad0 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 3f 20 30  rc->pIBIndex ? 0
1aae0 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74   : pProbe->pNext
1aaf0 29 2c 20 69 53 6f 72 74 49 64 78 2b 2b 0a 20 20  ), iSortIdx++.  
1ab00 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
1ab10 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
1ab20 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
1ab30 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
1ab40 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
1ab50 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
1ab60 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
1ab70 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1ab80 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
1ab90 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
1aba0 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
1abb0 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
1abc0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
1abd0 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
1abe0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
1abf0 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
1ac00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ac10 50 72 6f 62 65 2d 3e 62 4e 6f 51 75 65 72 79 20  Probe->bNoQuery 
1ac20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ac30 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
1ac40 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
1ac50 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
1ac60 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
1ac70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
1ac80 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
1ac90 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
1aca0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  0;.    pNew->nSk
1acb0 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
1acc0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
1acd0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
1ace0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1acf0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
1ad00 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
1ad10 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77  Prereq;.    pNew
1ad20 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
1ad30 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
1ad40 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
1ad50 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
1ad60 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
1ad70 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
1ad80 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
1ad90 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
1ada0 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
1adb0 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
1adc0 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
1add0 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
1ade0 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
1adf0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1ae00 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
1ae10 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
1ae20 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
1ae30 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
1ae40 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
1ae50 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
1ae60 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
1ae70 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1ae80 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
1ae90 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
1aea0 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
1aeb0 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
1aec0 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
1aed0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1aee0 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
1aef0 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
1af00 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
1af10 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
1af20 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
1af30 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
1af40 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
1af50 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
1af60 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
1af70 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
1af80 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
1af90 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1afa0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1afb0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
1afc0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
1afd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1afe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
1aff0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
1b000 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
1b010 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
1b020 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1b030 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1b040 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
1b050 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
1b060 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
1b070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1b080 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
1b090 20 26 20 70 50 72 6f 62 65 2d 3e 63 6f 6c 4e 6f   & pProbe->colNo
1b0a0 74 49 64 78 65 64 3b 0a 20 20 20 20 20 20 20 20  tIdxed;.        
1b0b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1b0c0 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
1b0d0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
1b0e0 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
1b0f0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d  INDEXED;.      }
1b100 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
1b110 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
1b120 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
1b130 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
1b140 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c  d(pTab).       |
1b150 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  | pProbe->pPartI
1b160 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
1b170 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20    || ( m==0.    
1b180 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
1b190 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
1b1a0 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62         && (pProb
1b1b0 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  e->szIdxRow<pTab
1b1c0 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20  ->szTabRow).    
1b1d0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1b1e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1b1f0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
1b200 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
1b210 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
1b220 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
1b230 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
1b240 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
1b250 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1b260 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
1b270 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
1b280 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
1b290 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1b2a0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
1b2b0 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20  Idx : 0;..      
1b2c0 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
1b2d0 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e   visiting the in
1b2e0 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c  dex rows is N*K,
1b2f0 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20   where K is.    
1b300 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31      ** between 1
1b310 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65  .1 and 3.0, depe
1b320 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c  nding on the rel
1b330 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74  ative sizes of t
1b340 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
1b350 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f  dex and table ro
1b360 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ws. */.        p
1b370 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
1b380 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  e + 1 + (15*pPro
1b390 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54  be->szIdxRow)/pT
1b3a0 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
1b3b0 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29        if( m!=0 )
1b3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1b3d0 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
1b3e0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
1b3f0 63 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20  can, add in the 
1b400 63 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20  cost of.        
1b410 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65    ** doing table
1b420 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63   lookups.  The c
1b430 6f 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74  ost will be 3x t
1b440 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
1b450 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70         ** lookup
1b460 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63  s.  Take into ac
1b470 63 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75  count WHERE clau
1b480 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  se terms that ca
1b490 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
1b4a0 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
1b4b0 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  g just the index
1b4c0 2c 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f  , and that do no
1b4d0 74 20 72 65 71 75 69 72 65 20 61 0a 20 20 20 20  t require a.    
1b4e0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c        ** table l
1b4f0 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20  ookup. */.      
1b500 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b      LogEst nLook
1b510 75 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b  up = rSize + 16;
1b520 20 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20    /* Base cost: 
1b530 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20   N*3 */.        
1b540 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1b550 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
1b560 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  Src->iCursor;.  
1b570 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
1b580 75 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49  use *pWC2 = &pWI
1b590 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20  nfo->sWC;.      
1b5a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1b5b0 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69  <pWC2->nTerm; ii
1b5c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1b5d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1b5e0 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d  m = &pWC2->a[ii]
1b5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1b600 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
1b610 76 65 72 65 64 42 79 49 6e 64 65 78 28 70 54 65  veredByIndex(pTe
1b620 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c  rm->pExpr, iCur,
1b630 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
1b640 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b650 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54             /* pT
1b670 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75  erm can be evalu
1b680 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20  ated using just 
1b690 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72  the index.  So r
1b6a0 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20  educe.          
1b6b0 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65    ** the expecte
1b6c0 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  d number of tabl
1b6d0 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64  e lookups accord
1b6e0 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20  ingly */.       
1b6f0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1b700 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a  truthProb<=0 ){.
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
1b720 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e  ookup += pTerm->
1b730 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
1b740 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b750 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f              nLoo
1b760 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  kup--;.         
1b770 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1b780 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1b790 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f  EQ|WO_IS) ) nLoo
1b7a0 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20  kup -= 19;.     
1b7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b7c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
1b7d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1b7e0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
1b7f0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
1b800 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20  un, nLookup);.  
1b810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b820 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
1b830 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
1b840 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
1b850 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
1b860 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
1b870 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
1b880 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1b890 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1b8a0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1b8b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1b8c0 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1b8d0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
1b8e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b8f0 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  }..    pBuilder-
1b900 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20  >bldFlags = 0;. 
1b910 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1b920 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
1b930 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
1b940 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69  Probe, 0);.    i
1b950 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64  f( pBuilder->bld
1b960 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c  Flags==SQLITE_BL
1b970 44 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  DF_INDEXED ){.  
1b980 20 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d      /* If a non-
1b990 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20  unique index is 
1b9a0 75 73 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72  used, or if a pr
1b9b0 65 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20  efix of the key 
1b9c0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69  for.      ** uni
1b9d0 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65  que index is use
1b9e0 64 20 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e  d (making the in
1b9f0 64 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79  dex functionally
1ba00 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20   non-unique).   
1ba10 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73     ** then the s
1ba20 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61  qlite_stat1 data
1ba30 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61   becomes importa
1ba40 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74  nt for scoring t
1ba50 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e  he.      ** plan
1ba60 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
1ba70 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53  tabFlags |= TF_S
1ba80 74 61 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a  tatsUsed;.    }.
1ba90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1baa0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
1bab0 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53  AT4.    sqlite3S
1bac0 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42  tat4ProbeFree(pB
1bad0 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20  uilder->pRec);. 
1bae0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
1baf0 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  cValid = 0;.    
1bb00 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
1bb10 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20   0;.#endif.  }. 
1bb20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1bb30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bb40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1bb50 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
1bb60 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c 72 65  pIdxInfo is alre
1bb70 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ady populated wi
1bb80 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  th all constrain
1bb90 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62  ts that may.** b
1bba0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 76 69  e used by the vi
1bbb0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64 65 6e  rtual table iden
1bbc0 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  tified by pBuild
1bbd0 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
1bbe0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1bbf0 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65 74 20   marks a subset 
1bc00 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74 72 61  of those constra
1bc10 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69 6e 76  ints usable, inv
1bc20 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42 65 73  okes the.** xBes
1bc30 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 6e  tIndex method an
1bc40 64 20 61 64 64 73 20 74 68 65 20 72 65 74 75 72  d adds the retur
1bc50 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42 75 69  ned plan to pBui
1bc60 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f  lder..**.** A co
1bc70 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61 72 6b  nstraint is mark
1bc80 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a  ed usable if:.**
1bc90 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e 74  .**   * Argument
1bca0 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63 61 74   mUsable indicat
1bcb0 65 73 20 74 68 61 74 20 69 74 73 20 70 72 65 72  es that its prer
1bcc0 65 71 75 69 73 69 74 65 73 20 61 72 65 20 61 76  equisites are av
1bcd0 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a  ailable, and.**.
1bce0 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e 6f 74  **   * It is not
1bcf0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
1bd00 61 74 6f 72 73 20 73 70 65 63 69 66 69 65 64 20  ators specified 
1bd10 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64 65 20  in the mExclude 
1bd20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20  mask passed.**  
1bd30 20 20 20 61 73 20 74 68 65 20 66 6f 75 72 74 68     as the fourth
1bd40 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69 63 68   argument (which
1bd50 20 69 6e 20 70 72 61 63 74 69 63 65 20 69 73 20   in practice is 
1bd60 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20  either WO_IN or 
1bd70 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  0)..**.** Argume
1bd80 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20 61 20  nt mPrereq is a 
1bd90 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74  mask of tables t
1bda0 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1bdb0 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ned before the.*
1bdc0 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
1bdd0 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54 68 65  in question. The
1bde0 73 65 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  se are added to 
1bdf0 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72 65 71  the plans prereq
1be00 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72  uisites.** befor
1be10 65 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f  e it is added to
1be20 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
1be30 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
1be40 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74 20 74  r *pbIn is set t
1be50 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 70 6c  o true if the pl
1be60 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42 75 69  an added to pBui
1be70 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65  lder.** uses one
1be80 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74   or more WO_IN t
1be90 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f  erms, or false o
1bea0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1beb0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1bec0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1bed0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1bee0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
1bef0 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf10 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65  /* Mask of table
1bf20 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 75  s that must be u
1bf30 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  sed. */.  Bitmas
1bf40 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20 20 20  k mUsable,      
1bf50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1bf60 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61 62 6c  k of usable tabl
1bf70 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63  es */.  u16 mExc
1bf80 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  lude,           
1bf90 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 6c 75          /* Exclu
1bfa0 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67 20 74  de terms using t
1bfb0 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20 2a  hese operators *
1bfc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1bfd0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
1bfe0 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64  ,   /* Populated
1bff0 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42 65 73   object for xBes
1c000 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  tIndex */.  u16 
1c010 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20 20  mNoOmit,        
1c020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1c030 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73 65  o not omit these
1c040 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1c050 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20    int *pbIn     
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69    /* OUT: True i
1c080 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49  f plan uses an I
1c090 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a  N(...) op */.){.
1c0a0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c0b0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1c0c0 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  WC;.  struct sql
1c0d0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1c0e0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
1c0f0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
1c100 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
1c110 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
1c120 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
1c130 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
1c140 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78   int i;.  int mx
1c150 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Term;.  int rc =
1c160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68   SQLITE_OK;.  Wh
1c170 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20  ereLoop *pNew = 
1c180 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1c190 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1c1a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1c1b0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74  fo->pParse;.  st
1c1c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c1d0 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c  m *pSrc = &pBuil
1c1e0 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61  der->pWInfo->pTa
1c1f0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
1c200 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e  Tab];.  int nCon
1c210 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
1c220 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
1c230 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55 73  ..  assert( (mUs
1c240 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d  able & mPrereq)=
1c250 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70  =mPrereq );.  *p
1c260 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  bIn = 0;.  pNew-
1c270 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
1c280 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  q;..  /* Set the
1c290 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20   usable flag on 
1c2a0 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f  the subset of co
1c2b0 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69  nstraints identi
1c2c0 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72  fied by .  ** ar
1c2d0 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20  guments mUsable 
1c2e0 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f  and mExclude. */
1c2f0 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
1c300 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1c310 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
1c320 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
1c330 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
1c340 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1c350 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
1c360 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54  s++){.    WhereT
1c370 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
1c380 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69  C->a[pIdxCons->i
1c390 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20  TermOffset];.   
1c3a0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
1c3b0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  e = 0;.    if( (
1c3c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1c3d0 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70  ht & mUsable)==p
1c3e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1c3f0 74 20 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  t .     && (pTer
1c400 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d  m->eOperator & m
1c410 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20  Exclude)==0.    
1c420 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  ){.      pIdxCon
1c430 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
1c440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1c450 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
1c460 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74  tput fields of t
1c470 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
1c480 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
1c490 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61  */.  memset(pUsa
1c4a0 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
1c4b0 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72  sage[0])*nConstr
1c4c0 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28  aint);.  assert(
1c4d0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1c4e0 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29  oFreeIdxStr==0 )
1c4f0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
1c500 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
1c510 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
1c520 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  ;.  pIdxInfo->or
1c530 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
1c540 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
1c550 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
1c560 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
1c570 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64  (double)2;.  pId
1c580 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1c590 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64  Rows = 25;.  pId
1c5a0 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1c5b0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1c5c0 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69  >colUsed = (sqli
1c5d0 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e  te3_int64)pSrc->
1c5e0 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49  colUsed;..  /* I
1c5f0 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61  nvoke the virtua
1c600 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64  l table xBestInd
1c610 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  ex() method */. 
1c620 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
1c630 64 65 78 28 70 50 61 72 73 65 2c 20 70 53 72 63  dex(pParse, pSrc
1c640 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  ->pTab, pIdxInfo
1c650 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1c660 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65  turn rc;..  mxTe
1c670 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72  rm = -1;.  asser
1c680 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
1c690 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
1c6a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1c6b0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70  nstraint; i++) p
1c6c0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d  New->aLTerm[i] =
1c6d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
1c6e0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
1c6f0 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
1c700 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1c710 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
1c720 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
1c730 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
1c740 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1c750 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
1c760 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54  s++){.    int iT
1c770 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54  erm;.    if( (iT
1c780 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
1c790 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
1c7a0 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
1c7b0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
1c7c0 20 20 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43     int j = pIdxC
1c7d0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
1c7e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1c7f0 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
1c800 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
1c810 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e      || j>=pWC->n
1c820 54 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70  Term.       || p
1c830 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
1c840 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  m]!=0.       || 
1c850 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
1c860 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
1c870 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1c880 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e  rMsg(pParse,"%s.
1c890 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75  xBestIndex malfu
1c8a0 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54  nction",pSrc->pT
1c8b0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1c8c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
1c8d0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
1c8e0 65 65 49 64 78 53 74 72 20 29 3b 0a 20 20 20 20  eeIdxStr );.    
1c8f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c900 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
1c910 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c920 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
1c930 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  int-1 );.      t
1c940 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b  estcase( j==0 );
1c950 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c960 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
1c970 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   );.      pTerm 
1c980 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
1c990 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1c9a0 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
1c9b0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  qRight;.      as
1c9c0 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
1c9d0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
1c9e0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
1c9f0 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
1ca00 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
1ca10 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
1ca20 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74 65   iTerm;.      te
1ca30 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
1ca40 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  5 );.      testc
1ca50 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29  ase( iTerm==16 )
1ca60 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1ca70 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1ca80 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1ca90 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1caa0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1cab0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1cac0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
1cad0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1cae0 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
1caf0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
1cb00 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
1cb10 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
1cb20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
1cb30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1cb40 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
1cb50 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
1cb60 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 2a   terms.        *
1cb70 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
1cb80 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
1cb90 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
1cba0 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
1cbb0 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c        ** (2) Mul
1cbc0 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72  tiple outputs fr
1cbd0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76  om a single IN v
1cbe0 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65  alue will not me
1cbf0 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  rge.        ** t
1cc00 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1cc10 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
1cc20 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
1cc30 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78   0;.        pIdx
1cc40 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26  Info->idxFlags &
1cc50 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  = ~SQLITE_INDEX_
1cc60 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20  SCAN_UNIQUE;.   
1cc70 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20       *pbIn = 1; 
1cc80 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75 64  assert( (mExclud
1cc90 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b  e & WO_IN)==0 );
1cca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ccb0 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61   }.  pNew->u.vta
1ccc0 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d  b.omitMask &= ~m
1ccd0 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d  NoOmit;..  pNew-
1cce0 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
1ccf0 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  +1;.  for(i=0; i
1cd00 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  <=mxTerm; i++){.
1cd10 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c      if( pNew->aL
1cd20 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  Term[i]==0 ){.  
1cd30 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 6e 2d 7a      /* The non-z
1cd40 65 72 6f 20 61 72 67 76 49 64 78 20 76 61 6c 75  ero argvIdx valu
1cd50 65 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 74 69  es must be conti
1cd60 67 75 6f 75 73 2e 20 20 52 61 69 73 65 20 61 6e  guous.  Raise an
1cd70 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  .      ** error 
1cd80 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  if they are not 
1cd90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1cda0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cdb0 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d  "%s.xBestIndex m
1cdc0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63  alfunction",pSrc
1cdd0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1cde0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cdf0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1ce00 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a 20 20  FreeIdxStr );.  
1ce10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ce20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1ce30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1ce40 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
1ce50 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65  >nLSlot );.  pNe
1ce60 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
1ce70 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1ce80 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Num;.  pNew->u.v
1ce90 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
1cea0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1ceb0 72 65 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64  reeIdxStr;.  pId
1cec0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1ced0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
1cee0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
1cef0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
1cf00 64 78 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75  dxStr;.  pNew->u
1cf10 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
1cf20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d  = (i8)(pIdxInfo-
1cf30 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1cf40 20 3f 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66   ?.      pIdxInf
1cf50 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29  o->nOrderBy : 0)
1cf60 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
1cf70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52   = 0;.  pNew->rR
1cf80 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
1cf90 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
1cfa0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1cfb0 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Cost);.  pNew->n
1cfc0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
1cfd0 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
1cfe0 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20  timatedRows);.. 
1cff0 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48 45 52   /* Set the WHER
1d000 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66  E_ONEROW flag if
1d010 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
1d020 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74  ) method indicat
1d030 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1d040 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
1d050 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77   at most one row
1d060 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72  . Clear it other
1d070 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  wise. */.  if( p
1d080 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1d090 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  s & SQLITE_INDEX
1d0a0 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a  _SCAN_UNIQUE ){.
1d0b0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1d0c0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
1d0d0 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  W;.  }else{.    
1d0e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d  pNew->wsFlags &=
1d0f0 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a   ~WHERE_ONEROW;.
1d100 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65    }.  rc = where
1d110 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1d120 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66  der, pNew);.  if
1d130 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
1d140 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73  eedFree ){.    s
1d150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1d160 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
1d170 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
1d180 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
1d190 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
1d1a0 45 28 30 78 66 66 66 66 2c 20 28 22 20 20 62 49  E(0xffff, ("  bI
1d1b0 6e 3d 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30  n=%d prereqIn=%0
1d1c0 34 6c 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25  4llx prereqOut=%
1d1d0 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  04llx\n",.      
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f  *pbIn, (sqlite3_
1d200 75 69 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a  uint64)mPrereq,.
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75        (sqlite3_u
1d230 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65  int64)(pNew->pre
1d240 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29  req & ~mPrereq))
1d250 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1d260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 69  .}../*.** If thi
1d270 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1d280 76 6f 6b 65 64 20 66 72 6f 6d 20 77 69 74 68 69  voked from withi
1d290 6e 20 61 6e 20 78 42 65 73 74 49 6e 64 65 78 28  n an xBestIndex(
1d2a0 29 20 63 61 6c 6c 62 61 63 6b 2c 20 69 74 0a 2a  ) callback, it.*
1d2b0 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
1d2c0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
1d2d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
1d2e0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ame of the colla
1d2f0 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65  tion.** sequence
1d300 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1d310 20 65 6c 65 6d 65 6e 74 20 69 43 6f 6e 73 20 6f   element iCons o
1d320 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
1d330 64 65 78 5f 69 6e 66 6f 2e 61 43 6f 6e 73 74 72  dex_info.aConstr
1d340 61 69 6e 74 0a 2a 2a 20 61 72 72 61 79 2e 20 4f  aint.** array. O
1d350 72 2c 20 69 66 20 69 43 6f 6e 73 20 69 73 20 6f  r, if iCons is o
1d360 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20 74  ut of range or t
1d370 68 65 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76  here is no activ
1d380 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20  e xBestIndex.** 
1d390 63 61 6c 6c 2c 20 72 65 74 75 72 6e 20 4e 55 4c  call, return NUL
1d3a0 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  L..*/.const char
1d3b0 20 2a 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63   *sqlite3_vtab_c
1d3c0 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c 69 74 65 33  ollation(sqlite3
1d3d0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
1d3e0 78 49 6e 66 6f 2c 20 69 6e 74 20 69 43 6f 6e 73  xInfo, int iCons
1d3f0 29 7b 0a 20 20 48 69 64 64 65 6e 49 6e 64 65 78  ){.  HiddenIndex
1d400 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 20 3d 20  Info *pHidden = 
1d410 28 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f  (HiddenIndexInfo
1d420 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
1d430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
1d440 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 43  et = 0;.  if( iC
1d450 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f 6e 73 3c  ons>=0 && iCons<
1d460 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
1d470 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 43 6f 6c  raint ){.    Col
1d480 6c 53 65 71 20 2a 70 43 20 3d 20 30 3b 0a 20 20  lSeq *pC = 0;.  
1d490 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 70 49    int iTerm = pI
1d4a0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1d4b0 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54 65 72 6d  int[iCons].iTerm
1d4c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 45 78 70 72  Offset;.    Expr
1d4d0 20 2a 70 58 20 3d 20 70 48 69 64 64 65 6e 2d 3e   *pX = pHidden->
1d4e0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
1d4f0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 58 2d  xpr;.    if( pX-
1d500 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
1d510 70 43 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  pC = sqlite3Bina
1d520 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1d530 28 70 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65  (pHidden->pParse
1d540 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
1d550 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
1d560 20 20 20 20 7a 52 65 74 20 3d 20 28 70 43 20 3f      zRet = (pC ?
1d570 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c   pC->zName : sql
1d580 69 74 65 33 53 74 72 42 49 4e 41 52 59 29 3b 0a  ite3StrBINARY);.
1d590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
1d5a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  t;.}../*.** Add 
1d5b0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
1d5c0 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
1d5d0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
1d5e0 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
1d5f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
1d600 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
1d610 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1d620 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
1d630 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
1d640 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54  here are no LEFT
1d650 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a   or CROSS JOIN j
1d660 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  oins in the quer
1d670 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71 20  y, both mPrereq 
1d680 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  and.** mUnusable
1d690 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f   are set to 0. O
1d6a0 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72 65  therwise, mPrere
1d6b0 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61  q is a mask of a
1d6c0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  ll FROM clause.*
1d6d0 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  * entries that o
1d6e0 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
1d6f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
1d700 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d710 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61   and are.** sepa
1d720 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
1d730 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
1d740 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1d750 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
1d760 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61  .** mUnusable ma
1d770 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  sk contains all 
1d780 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
1d790 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  ies that occur a
1d7a0 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74  fter the.** virt
1d7b0 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72  ual table and ar
1d7c0 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  e separated from
1d7d0 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
1d7e0 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20  one LEFT or .** 
1d7f0 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a  CROSS JOIN. .**.
1d800 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1d810 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72  if the query wer
1d820 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  e:.**.**   ... F
1d830 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20  ROM t1, t2 LEFT 
1d840 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20  JOIN t3, t4, vt 
1d850 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74  CROSS JOIN t5, t
1d860 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50  6;.**.** then mP
1d870 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e 64  rereq correspond
1d880 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e  s to (t1, t2) an
1d890 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28  d mUnusable to (
1d8a0 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41  t5, t6)..**.** A
1d8b0 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  ll the tables in
1d8c0 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62 65   mPrereq must be
1d8d0 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1d8e0 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1d8f0 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53  ual .** table. S
1d900 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20  o any terms for 
1d910 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71  which all prereq
1d920 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74 69  uisites are sati
1d930 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72  sfied by .** mPr
1d940 65 72 65 71 20 6d 61 79 20 62 65 20 73 70 65 63  ereq may be spec
1d950 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c 65  ified as "usable
1d960 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74  " in all calls t
1d970 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a  o xBestIndex. .*
1d980 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c  * Conversely, al
1d990 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75  l tables in mUnu
1d9a0 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73 63  sable must be sc
1d9b0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  anned after the 
1d9c0 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75  current.** virtu
1d9d0 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79  al table, so any
1d9e0 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
1d9f0 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69 74   the prerequisit
1da00 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68 0a  es overlap with.
1da10 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f  ** mUnusable sho
1da20 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6f  uld always be co
1da30 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f 74  nfigured as "not
1da40 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42 65  -usable" for xBe
1da50 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  stIndex..*/.stat
1da60 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1da70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
1da80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1da90 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
1daa0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
1dab0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
1dac0 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1dad0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1dae0 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1daf0 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
1db00 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74  his one */.  Bit
1db10 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20  mask mUnusable  
1db20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1db30 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1db40 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
1db50 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20  his one */.){.  
1db60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1db70 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1db80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1db90 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1dba0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
1dbb0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
1dbc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
1dbd0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1dbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dbf0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1dc00 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1dc10 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
1dc20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1dc30 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1dc40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1dc50 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
1dc60 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1dc70 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1dc80 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1dc90 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20  fo *p;       /* 
1dca0 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20 74  Object to pass t
1dcb0 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 2a  o xBestIndex() *
1dcc0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  /.  int nConstra
1dcd0 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
1dce0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
1dcf0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20 2a  nstraints in p *
1dd00 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20 20  /.  int bIn;    
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61 6e   /* True if plan
1dd30 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70   uses IN(...) op
1dd40 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72  erator */.  Wher
1dd50 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42  eLoop *pNew;.  B
1dd60 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20 20  itmask mBest;   
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dd80 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62 65  ables used by be
1dd90 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e  st possible plan
1dda0 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69   */.  u16 mNoOmi
1ddb0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d  t;..  assert( (m
1ddc0 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61 62  Prereq & mUnusab
1ddd0 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e  le)==0 );.  pWIn
1dde0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1ddf0 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
1de00 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1de10 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
1de20 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20  er->pWC;.  pNew 
1de30 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1de40 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e  ;.  pSrc = &pWIn
1de50 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1de60 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61  pNew->iTab];.  a
1de70 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
1de80 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
1de90 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e    p = allocateIn
1dea0 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
1deb0 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20  pWC, mUnusable, 
1dec0 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
1ded0 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
1dee0 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66   &mNoOmit);.  if
1def0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1df00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1df10 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  T;.  pNew->rSetu
1df20 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77  p = 0;.  pNew->w
1df30 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
1df40 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70  IRTUALTABLE;.  p
1df50 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
1df60 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1df70 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1df80 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d  nConstraint = p-
1df90 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
1dfa0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
1dfb0 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ize(pParse->db, 
1dfc0 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
1dfd0 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
1dfe0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1dff0 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75  db, p);.    retu
1e000 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
1e010 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1e020 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74  First call xBest
1e030 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c  Index() with all
1e040 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61   constraints usa
1e050 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54  ble. */.  WHERET
1e060 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 42 45  RACE(0x800, ("BE
1e070 47 49 4e 20 25 73 2e 61 64 64 56 69 72 74 75 61  GIN %s.addVirtua
1e080 6c 28 29 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54  l()\n", pSrc->pT
1e090 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 57  ab->zName));.  W
1e0a0 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1e0b0 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1e0c0 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b  all usable\n"));
1e0d0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  .  rc = whereLoo
1e0e0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70  pAddVirtualOne(p
1e0f0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1e100 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c  , ALLBITS, 0, p,
1e110 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1e120 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
1e130 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ll to xBestIndex
1e140 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65 72 6d  () with all term
1e150 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64 75 63  s enabled produc
1e160 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a 20 74  ed a plan.  ** t
1e170 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1e180 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63 65 20  uire any source 
1e190 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61 20 70  tables (IOW: a p
1e1a0 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74 3d 3d  lan with mBest==
1e1b0 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  0),.  ** then th
1e1c0 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1e1d0 69 6e 20 6d 61 6b 69 6e 67 20 61 6e 79 20 66 75  in making any fu
1e1e0 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 78  rther calls to x
1e1f0 42 65 73 74 49 6e 64 65 78 28 29 20 0a 20 20 2a  BestIndex() .  *
1e200 2a 20 73 69 6e 63 65 20 74 68 65 79 20 77 69 6c  * since they wil
1e210 6c 20 61 6c 6c 20 72 65 74 75 72 6e 20 74 68 65  l all return the
1e220 20 73 61 6d 65 20 72 65 73 75 6c 74 20 28 69 66   same result (if
1e230 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
1e240 29 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ).  ** implement
1e250 61 74 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20  ation is sane). 
1e260 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1e270 49 54 45 5f 4f 4b 20 26 26 20 28 6d 42 65 73 74  ITE_OK && (mBest
1e280 20 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72 65 71   = (pNew->prereq
1e290 20 26 20 7e 6d 50 72 65 72 65 71 29 29 21 3d 30   & ~mPrereq))!=0
1e2a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
1e2b0 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
1e2c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e2d0 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20   a plan with no 
1e2e0 70 72 65 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a  prereqs seen */.
1e2f0 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f      int seenZero
1e300 4e 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 20 20  NoIN = 0;       
1e310 20 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e    /* Plan with n
1e320 6f 20 70 72 65 72 65 71 73 20 61 6e 64 20 6e 6f  o prereqs and no
1e330 20 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f   IN(...) seen */
1e340 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  .    Bitmask mPr
1e350 65 76 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d  ev = 0;.    Bitm
1e360 61 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20  ask mBestNoIn = 
1e370 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
1e380 65 20 70 6c 61 6e 20 70 72 6f 64 75 63 65 64 20  e plan produced 
1e390 62 79 20 74 68 65 20 65 61 72 6c 69 65 72 20 63  by the earlier c
1e3a0 61 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e 28 2e  all uses an IN(.
1e3b0 2e 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20  ..) term, call. 
1e3c0 20 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78     ** xBestIndex
1e3d0 20 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69 6d   again, this tim
1e3e0 65 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74  e with IN(...) t
1e3f0 65 72 6d 73 20 64 69 73 61 62 6c 65 64 2e 20 2a  erms disabled. *
1e400 2f 0a 20 20 20 20 69 66 28 20 62 49 6e 20 29 7b  /.    if( bIn ){
1e410 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1e420 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1e430 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1e440 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a  le w/o IN\n"));.
1e450 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e460 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1e470 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1e480 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1e490 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20  ALLBITS, WO_IN, 
1e4a0 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e  p, mNoOmit, &bIn
1e4b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e4c0 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   bIn==0 );.     
1e4d0 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65   mBestNoIn = pNe
1e4e0 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72  w->prereq & ~mPr
1e4f0 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28 20  ereq;.      if( 
1e500 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a  mBestNoIn==0 ){.
1e510 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f          seenZero
1e520 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65   = 1;.        se
1e530 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1e540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e550 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74     /* Call xBest
1e560 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20 65  Index once for e
1e570 61 63 68 20 64 69 73 74 69 6e 63 74 20 76 61 6c  ach distinct val
1e580 75 65 20 6f 66 20 28 70 72 65 72 65 71 52 69 67  ue of (prereqRig
1e590 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20 0a  ht & ~mPrereq) .
1e5a0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 65      ** in the se
1e5b0 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74 20  t of terms that 
1e5c0 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75 72  apply to the cur
1e5d0 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61 62  rent virtual tab
1e5e0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  le.  */.    whil
1e5f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1e600 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1e610 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1e620 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a  Next = ALLBITS;.
1e630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 4e        assert( mN
1e640 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 66  ext>0 );.      f
1e650 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
1e660 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
1e670 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 68       Bitmask mTh
1e680 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20  is = (.         
1e690 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f     pWC->a[p->aCo
1e6a0 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
1e6b0 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
1e6c0 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 0a  ight & ~mPrereq.
1e6d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1e6e0 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50 72     if( mThis>mPr
1e6f0 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78  ev && mThis<mNex
1e700 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69  t ) mNext = mThi
1e710 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  s;.      }.     
1e720 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a   mPrev = mNext;.
1e730 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d        if( mNext=
1e740 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61 6b  =ALLBITS ) break
1e750 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78  ;.      if( mNex
1e760 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78  t==mBest || mNex
1e770 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63  t==mBestNoIn ) c
1e780 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
1e790 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1e7a0 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1e7b0 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65  mPrev=%04llx mNe
1e7c0 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  xt=%04llx\n",.  
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69       (sqlite3_ui
1e7f0 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71 6c  nt64)mPrev, (sql
1e800 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78  ite3_uint64)mNex
1e810 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
1e820 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1e830 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1e840 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1e850 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72  req, mNext|mPrer
1e860 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  eq, 0, p, mNoOmi
1e870 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1e880 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  if( pNew->prereq
1e890 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20 20 20  ==mPrereq ){.   
1e8a0 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20       seenZero = 
1e8b0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  1;.        if( b
1e8c0 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f  In==0 ) seenZero
1e8d0 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  NoIN = 1;.      
1e8e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e8f0 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20  If the calls to 
1e900 78 42 65 73 74 49 6e 64 65 78 28 29 20 69 6e 20  xBestIndex() in 
1e910 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64  the above loop d
1e920 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c  id not find a pl
1e930 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  an.    ** that r
1e940 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63  equires no sourc
1e950 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20  e tables at all 
1e960 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e  (i.e. one guaran
1e970 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a  teed to be.    *
1e980 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20  * usable), make 
1e990 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69 74 68  a call here with
1e9a0 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c   all source tabl
1e9b0 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  es disabled */. 
1e9c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e9d0 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f  E_OK && seenZero
1e9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45  ==0 ){.      WHE
1e9f0 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1ea00 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1ea10 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b  l disabled\n"));
1ea20 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1ea30 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1ea40 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1ea50 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1ea60 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20   mPrereq, 0, p, 
1ea70 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1ea80 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1ea90 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1eaa0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1eab0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20  /* If the calls 
1eac0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1ead0 68 61 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c  have so far fail
1eae0 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61  ed to find a pla
1eaf0 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  n.    ** that re
1eb00 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65  quires no source
1eb10 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61   tables at all a
1eb20 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  nd does not use 
1eb30 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a  an IN(...).    *
1eb40 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65  * operator, make
1eb50 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f   a final call to
1eb60 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65   obtain one here
1eb70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
1eb80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1eb90 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29  eenZeroNoIN==0 )
1eba0 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1ebb0 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1ebc0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1ebd0 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e  abled and w/o IN
1ebe0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1ebf0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1ec00 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1ec10 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1ec20 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20  rereq, mPrereq, 
1ec30 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  WO_IN, p, mNoOmi
1ec40 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a  t, &bIn);.    }.
1ec50 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65    }..  if( p->ne
1ec60 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1ec70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1ec80 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1ec90 74 65 33 44 62 46 72 65 65 4e 4e 28 70 50 61 72  te3DbFreeNN(pPar
1eca0 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 57 48  se->db, p);.  WH
1ecb0 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
1ecc0 28 22 45 4e 44 20 25 73 2e 61 64 64 56 69 72 74  ("END %s.addVirt
1ecd0 75 61 6c 28 29 2c 20 72 63 3d 25 64 5c 6e 22 2c  ual(), rc=%d\n",
1ece0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
1ecf0 6d 65 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75  me, rc));.  retu
1ed00 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1ed10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1ed20 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1ed30 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
1ed40 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
1ed50 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
1ed60 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
1ed70 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
1ed80 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
1ed90 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1eda0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
1edb0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1edc0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
1edd0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1ede0 65 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  eq, .  Bitmask m
1edf0 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68  Unusable.){.  Wh
1ee00 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1ee10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1ee20 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  fo;.  WhereClaus
1ee30 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
1ee40 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
1ee50 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
1ee60 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
1ee70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ee80 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
1ee90 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
1eea0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1eeb0 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
1eec0 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c  WhereOrSet sSum,
1eed0 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20   sCur;.  struct 
1eee0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1eef0 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20  tem;.  .  pWC = 
1ef00 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1ef10 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61   pWCEnd = pWC->a
1ef20 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
1ef30 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
1ef40 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74  ->pNew;.  memset
1ef50 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&sSum, 0, sizeo
1ef60 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65  f(sSum));.  pIte
1ef70 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
1ef80 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
1ef90 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70  iTab;.  iCur = p
1efa0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a  Item->iCursor;..
1efb0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1efc0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
1efd0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1efe0 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
1eff0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1f000 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
1f010 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
1f020 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
1f030 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
1f040 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
1f050 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
1f060 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
1f070 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
1f080 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
1f090 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
1f0a0 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
1f0b0 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
1f0c0 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
1f0d0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
1f0e0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
1f0f0 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
1f100 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
1f110 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
1f120 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
1f130 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
1f140 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
1f150 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
1f160 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57   &sCur;..      W
1f170 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
1f180 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73   ("Begin process
1f190 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1f1a0 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1f1b0 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
1f1c0 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
1f1d0 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
1f1e0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1f1f0 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
1f200 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
1f210 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f220 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
1f230 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
1f240 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
1f250 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
1f260 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
1f270 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
1f280 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
1f290 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
1f2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1f2b0 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
1f2c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1f2d0 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
1f2e0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f2f0 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
1f300 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
1f310 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
1f320 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1f330 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
1f340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f350 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1f360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f370 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
1f380 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
1f390 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57  NABLED.        W
1f3a0 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
1f3b0 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66   ("OR-term %d of
1f3c0 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65   %p has %d subte
1f3d0 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20  rms:\n", .      
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
1f3f0 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43  t)(pOrTerm-pOrWC
1f400 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75  ->a), pTerm, sSu
1f410 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
1f420 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
1f430 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
1f440 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
1f450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1f460 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28  hereClausePrint(
1f470 73 53 75 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a  sSubBuild.pWC);.
1f480 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
1f490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f4a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1f4b0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
1f4c0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1f4d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1f4e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1f4f0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
1f500 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1f510 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1f520 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1f530 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1f540 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1f550 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
1f560 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 29  bBuild, mPrereq)
1f570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f5a0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1f5b0 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c  pAddOr(&sSubBuil
1f5c0 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  d, mPrereq, mUnu
1f5d0 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1f5e0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1f5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f600 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a  || sCur.n==0 );.
1f610 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72          if( sCur
1f620 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
1f630 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
1f640 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1f650 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f660 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
1f670 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1f680 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20  &sSum, &sCur);. 
1f690 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
1f6a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1f6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
1f6c0 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20  eOrSet sPrev;.  
1f6d0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1f6e0 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
1f6f0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
1f700 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1f710 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1f720 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
1f730 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1f740 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
1f750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f760 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
1f770 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
1f780 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
1f790 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [j].prereq,.    
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
1f7c0 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
1f7d0 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61  [i].rRun, sCur.a
1f7e0 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20  [j].rRun),.     
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1f810 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
1f820 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b  i].nOut, sCur.a[
1f830 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  j].nOut));.     
1f840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
1f870 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
1f880 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
1f890 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
1f8a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1f8b0 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
1f8c0 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  OR;.      pNew->
1f8d0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
1f8e0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
1f8f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
1f900 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
1f910 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
1f920 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1f930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f940 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29  & i<sSum.n; i++)
1f950 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  {.        /* TUN
1f960 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73  ING: Currently s
1f970 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73  Sum.a[i].rRun is
1f980 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20   set to the sum 
1f990 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20  of the costs.   
1f9a0 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73       ** of all s
1f9b0 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65  ub-scans require
1f9c0 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e  d by the OR-scan
1f9d0 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74  . However, due t
1f9e0 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20  o rounding.     
1f9f0 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74     ** errors, it
1fa00 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65   may be that the
1fa10 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d   cost of the OR-
1fa20 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f  scan is equal to
1fa30 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
1fa40 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73  most expensive s
1fa50 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65  ub-scan. Add the
1fa60 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62   smallest possib
1fa70 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20  le penalty .    
1fa80 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65      ** (equivale
1fa90 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e  nt to multiplyin
1faa0 67 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e  g the cost by 1.
1fab0 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68  07) to ensure th
1fac0 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  at .        ** t
1fad0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  his does not hap
1fae0 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  pen. Otherwise, 
1faf0 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
1fb00 73 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20  s such as the.  
1fb10 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
1fb20 6e 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69  ng where there i
1fb30 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79  s an index on "y
1fb40 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ":.        **.  
1fb50 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45        **     WHE
1fb60 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d  RE likelihood(x=
1fb70 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a  ?, 0.99) OR y=?.
1fb80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1fb90 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65     ** the planne
1fba0 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22  r may elect to "
1fbb0 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66  OR" together a f
1fbc0 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61  ull-table scan a
1fbd0 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  nd an.        **
1fbe0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41   index lookup. A
1fbf0 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72  nd other similar
1fc00 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20  ly odd results. 
1fc10 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1fc20 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
1fc30 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20  i].rRun + 1;.   
1fc40 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
1fc50 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74  = sSum.a[i].nOut
1fc60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1fc70 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b  prereq = sSum.a[
1fc80 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  i].prereq;.     
1fc90 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1fca0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1fcb0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
1fcc0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1fcd0 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70  E(0x200, ("End p
1fce0 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
1fcf0 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
1fd00 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1fd10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fd20 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
1fd30 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
1fd40 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
1fd50 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1fd60 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
1fd70 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
1fd80 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
1fd90 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
1fda0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
1fdb0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1fdc0 65 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73  eq = 0;.  Bitmas
1fdd0 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  k mPrior = 0;.  
1fde0 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c  int iTab;.  SrcL
1fdf0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
1fe00 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1fe10 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1fe20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1fe30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1fe40 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70  _item *pEnd = &p
1fe50 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66  TabList->a[pWInf
1fe60 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71  o->nLevel];.  sq
1fe70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
1fe80 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1fe90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1fea0 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  E_OK;.  WhereLoo
1feb0 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72  p *pNew;.  u8 pr
1fec0 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  iorJointype = 0;
1fed0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1fee0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
1fef0 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
1ff00 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
1ff10 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
1ff20 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
1ff30 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
1ff40 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
1ff50 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
1ff60 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62  pItem<pEnd; iTab
1ff70 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1ff80 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61    Bitmask mUnusa
1ff90 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ble = 0;.    pNe
1ffa0 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a  w->iTab = iTab;.
1ffb0 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65      pNew->maskSe
1ffc0 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
1ffd0 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
1ffe0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
1fff0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
20000 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67   if( ((pItem->fg
20010 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a  .jointype|priorJ
20020 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c  ointype) & (JT_L
20030 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
20040 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
20050 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
20060 74 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20  true when pItem 
20070 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  is the FROM clau
20080 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20  se term on the. 
20090 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61       ** right-ha
200a0 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46  nd-side of a LEF
200b0 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e  T or CROSS JOIN.
200c0 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65 72    */.      mPrer
200d0 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20  eq = mPrior;.   
200e0 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e   }.    priorJoin
200f0 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67  type = pItem->fg
20100 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e 64  .jointype;.#ifnd
20110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
20120 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
20130 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
20140 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
20150 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
20160 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20  st_item *p;.    
20170 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31    for(p=&pItem[1
20180 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
20190 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e  .        if( mUn
201a0 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67  usable || (p->fg
201b0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  .jointype & (JT_
201c0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20  LEFT|JT_CROSS)) 
201d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e  ){.          mUn
201e0 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65  usable |= sqlite
201f0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
20200 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
20210 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20   p->iCursor);.  
20220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20230 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
20240 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
20250 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
20260 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
20270 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
20280 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
20290 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20  RTUALTABLE */.  
202a0 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77    {.      rc = w
202b0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
202c0 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
202d0 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eq);.    }.    i
202e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
202f0 20 26 26 20 70 42 75 69 6c 64 65 72 2d 3e 70 57   && pBuilder->pW
20300 43 2d 3e 68 61 73 4f 72 20 29 7b 0a 20 20 20 20  C->hasOr ){.    
20310 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
20320 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20  AddOr(pBuilder, 
20330 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62  mPrereq, mUnusab
20340 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  le);.    }.    m
20350 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d  Prior |= pNew->m
20360 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
20370 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f   rc || db->mallo
20380 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
20390 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f  .  }..  whereLoo
203a0 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
203b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
203c0 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
203d0 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
203e0 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
203f0 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
20400 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36 74 68  eLoop of the 6th
20410 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
20420 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
20430 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
20440 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
20450 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
20460 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
20470 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
20480 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
20490 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20  .  Return N:.** 
204a0 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74  .**   N>0:   N t
204b0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
204c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
204d0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
204e0 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f  ==0:  No terms o
204f0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20500 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
20510 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20  ied.**   N<0:   
20520 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20  Unknown yet how 
20530 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52  many terms of OR
20540 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20  DER BY might be 
20550 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a  satisfied.   .**
20560 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
20570 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
20580 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
20590 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
205a0 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
205b0 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
205c0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
205d0 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
205e0 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
205f0 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
20600 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
20610 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
20620 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
20630 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
20640 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65  STINCT do not re
20650 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
20660 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
20670 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
20680 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
20690 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  alent rows are g
206a0 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
206b0 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
206c0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
206d0 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
206e0 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
206f0 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
20700 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
20710 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
20720 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
20730 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
20740 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
20750 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
20760 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68  tic i8 wherePath
20770 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
20780 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
20790 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
207a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
207b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
207c0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
207d0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
207e0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
207f0 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
20800 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
20810 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
20820 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
20830 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
20840 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
20850 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
20860 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f 72 20   _DISTINCTBY or 
20870 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 2a  _ORDERBY_LIMIT *
20880 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
20890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
208a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
208b0 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
208c0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
208d0 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
208e0 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
208f0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
20900 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
20910 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
20920 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
20930 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
20940 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
20950 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
20960 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
20970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20980 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
20990 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209b0 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
209c0 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
209d0 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
209e0 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
209f0 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
20a00 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
20a10 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
20a20 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
20a30 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
20a40 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
20a50 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
20a60 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
20a70 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
20a80 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
20a90 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
20aa0 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
20ab0 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
20ac0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20ad0 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f 70 4d  e */.  u16 eqOpM
20ae0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ask;         /* 
20af0 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69 74 79  Allowed equality
20b00 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
20b10 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
20b20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20b30 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
20b40 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
20b50 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
20b60 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
20b70 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
20b80 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
20b90 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
20ba0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
20bb0 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
20bc0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
20bd0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
20be0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
20bf0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
20c00 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
20c10 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
20c20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
20c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20c40 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
20c50 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
20c60 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
20c70 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
20c80 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
20c90 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
20ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
20cb0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
20cc0 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
20cd0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
20ce0 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
20cf0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
20d00 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
20d10 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
20d20 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
20d30 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
20d40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
20d50 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
20d60 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
20d70 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
20d80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20d90 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
20da0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
20db0 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
20dc0 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
20dd0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
20de0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
20df0 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
20e00 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
20e10 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
20e20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20e30 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
20e40 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
20e50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
20e60 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
20e70 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
20e80 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
20e90 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
20ea0 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
20eb0 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
20ec0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
20ed0 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
20ee0 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
20ef0 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
20f00 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
20f10 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
20f20 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
20f30 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
20f40 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
20f50 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
20f60 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
20f70 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
20f80 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
20f90 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
20fa0 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
20fb0 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
20fc0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
20fd0 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
20fe0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
20ff0 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
21000 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
21010 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
21020 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
21030 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
21040 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
21050 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
21060 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
21070 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
21080 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
21090 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
210a0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
210b0 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
210c0 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
210d0 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
210e0 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
210f0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
21100 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
21110 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
21120 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
21130 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
21140 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
21150 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
21160 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
21170 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
21180 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
21190 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
211a0 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
211b0 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
211c0 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
211d0 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
211e0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
211f0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
21200 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21210 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
21220 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
21230 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
21240 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
21250 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
21260 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
21270 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
21280 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
21290 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
212a0 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
212b0 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
212c0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
212d0 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
212e0 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
212f0 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
21300 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
21310 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
21320 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
21330 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
21340 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
21350 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
21360 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
21370 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
21380 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
21390 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
213a0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
213b0 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
213c0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
213d0 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
213e0 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
213f0 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
21400 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
21410 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
21420 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
21430 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
21440 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
21450 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
21460 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
21470 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
21480 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
21490 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
214a0 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
214b0 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
214c0 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
214d0 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
214e0 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
214f0 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
21500 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
21510 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
21520 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
21530 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
21540 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
21550 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45   eqOpMask = WO_E
21560 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f 5f 49  Q | WO_IS | WO_I
21570 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77 63 74  SNULL;.  if( wct
21580 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21590 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20  ORDERBY_LIMIT ) 
215a0 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49  eqOpMask |= WO_I
215b0 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  N;.  for(iLoop=0
215c0 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
215d0 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
215e0 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
215f0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
21600 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
21610 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
21620 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
21630 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a   iLoop<nLoop ){.
21640 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 50        pLoop = pP
21650 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
21660 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77 63 74  ];.      if( wct
21670 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21680 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20  ORDERBY_LIMIT ) 
21690 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65  continue;.    }e
216a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  lse{.      pLoop
216b0 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 7d 0a   = pLast;.    }.
216c0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
216d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
216e0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
216f0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
21700 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
21710 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e   ) obSat = obDon
21720 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
21730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21740 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
21750 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nIdxCol = 0;.   
21760 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57   }.    iCur = pW
21770 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
21780 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
21790 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
217a0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
217b0 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
217c0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
217d0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
217e0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
217f0 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
21800 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
21810 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
21820 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
21830 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
21840 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
21850 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
21860 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
21870 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
21880 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
21890 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
218a0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
218b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
218c0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
218d0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
218e0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
218f0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
21900 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
21910 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
21920 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
21930 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
21940 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
21950 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
21960 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
21970 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
21980 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
21990 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71 4f 70      ~ready, eqOp
219c0 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  Mask, 0);.      
219d0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
219e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
219f0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
21a00 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20  tor==WO_IN ){.  
21a10 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65 72 6d        /* IN term
21a20 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c 69 64  s are only valid
21a30 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69 6e 20   for sorting in 
21a40 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49 4d  the ORDER BY LIM
21a50 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  IT .        ** o
21a60 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e 64  ptimization, and
21a70 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68   then only if th
21a80 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ey are actually 
21a90 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
21aa0 62 79 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  by the query pla
21ab0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
21ac0 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
21ad0 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  & WHERE_ORDERBY_
21ae0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 20  LIMIT );.       
21af0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f   for(j=0; j<pLoo
21b00 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70 54 65  p->nLTerm && pTe
21b10 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rm!=pLoop->aLTer
21b20 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  m[j]; j++){}.   
21b30 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f       if( j>=pLoo
21b40 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74  p->nLTerm ) cont
21b50 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
21b60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
21b70 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
21b80 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20 70  |WO_IS))!=0 && p
21b90 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e  OBExpr->iColumn>
21ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
21bb0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
21bc0 6c 53 65 71 4d 61 74 63 68 28 70 57 49 6e 66 6f  lSeqMatch(pWInfo
21bd0 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  ->pParse, .     
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
21bf0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
21c00 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  r, pTerm->pExpr)
21c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
21c20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
21c40 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
21c50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
21c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21c70 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
21c80 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
21c90 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
21ca0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
21cb0 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
21cc0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
21cd0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
21ce0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
21cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b   = 0;.        nK
21d00 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eyCol = 0;.     
21d10 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a     nColumn = 1;.
21d20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21d30 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
21d40 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
21d50 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
21d60 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
21d70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
21d80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21d90 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49      nKeyCol = pI
21da0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  ndex->nKeyCol;. 
21db0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
21dc0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
21dd0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
21de0 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43  ( nColumn==nKeyC
21df0 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69  ol+1 || !HasRowi
21e00 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
21e10 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
21e20 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43  ert( pIndex->aiC
21e30 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d  olumn[nColumn-1]
21e40 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20  ==XN_ROWID.     
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e60 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
21e70 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
21e80 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  ));.        isOr
21e90 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73  derDistinct = Is
21ea0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
21eb0 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
21ec0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
21ed0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
21ee0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
21ef0 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
21f00 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
21f10 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
21f20 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
21f30 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
21f40 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
21f50 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
21f60 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
21f70 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
21f80 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
21f90 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 20         u8 bOnce 
21fa0 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20  = 1; /* True to 
21fb0 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  run the ORDER BY
21fc0 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a   search loop */.
21fd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21fe0 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
21ff0 65 65 2e 6e 45 71 20 0a 20 20 20 20 20 20 20 20  ee.nEq .        
22000 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61      || (pLoop->a
22010 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a  LTerm[j]==0)==(j
22020 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20  <pLoop->nSkip). 
22030 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22040 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
22050 2e 62 74 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e  .btree.nEq && j>
22060 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b  =pLoop->nSkip ){
22070 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20 65  .          u16 e
22080 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Op = pLoop->aLTe
22090 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[j]->eOperator
220a0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
220b0 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
220c0 20 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74   IS and ISNULL t
220d0 65 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69  erms.  (Also ski
220e0 70 20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a  p IN terms when.
220f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69            ** doi
22100 6e 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ng WHERE_ORDERBY
22110 5f 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e  _LIMIT processin
22120 67 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  g). .          *
22130 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
22140 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
22150 72 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f  rm is a column o
22160 66 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28  f an ((?,?) IN (
22170 53 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20  SELECT...)) .   
22180 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
22190 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74  sion for which t
221a0 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
221b0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
221c0 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  column,.        
221d0 20 20 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20    ** check that 
221e0 69 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63  it is the only c
221f0 6f 6c 75 6d 6e 20 75 73 65 64 20 62 79 20 74 68  olumn used by th
22200 69 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69  is loop. Otherwi
22210 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se,.          **
22220 20 69 66 20 69 74 20 69 73 20 6f 6e 65 20 6f 66   if it is one of
22230 20 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f   two or more, no
22240 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ne of the column
22250 73 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  s can be.       
22260 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
22270 20 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52 44   to match an ORD
22280 45 52 20 42 59 20 74 65 72 6d 2e 20 20 2a 2f 0a  ER BY term.  */.
22290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65            if( (e
222a0 4f 70 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d  Op & eqOpMask)!=
222b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
222c0 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
222d0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
222e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
222f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
22310 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
22320 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22330 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22340 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
22350 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22360 41 4c 57 41 59 53 28 65 4f 70 20 26 20 57 4f 5f  ALWAYS(eOp & WO_
22370 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IN) ){.         
22380 20 20 20 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a     /* ALWAYS() j
22390 75 73 74 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f  ustification: eO
223a0 70 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  p is an equality
223b0 20 6f 70 65 72 61 74 6f 72 20 64 75 65 20 74 6f   operator due to
223c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
223d0 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62   ** j<pLoop->u.b
223e0 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61  tree.nEq constra
223f0 69 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e 79 20  int above.  Any 
22400 65 71 75 61 6c 69 74 79 20 6f 74 68 65 72 0a 20  equality other. 
22410 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
22420 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61 70 74  an WO_IN is capt
22430 75 72 65 64 20 62 79 20 74 68 65 20 70 72 65 76  ured by the prev
22440 69 6f 75 73 20 22 69 66 22 2e 20 20 53 6f 20 74  ious "if".  So t
22450 68 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20  his one.        
22460 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61      ** always ha
22470 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a  s to be WO_IN. *
22480 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
22490 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e  pr *pX = pLoop->
224a0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72  aLTerm[j]->pExpr
224b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
224c0 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70  r(i=j+1; i<pLoop
224d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69  ->u.btree.nEq; i
224e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
224f0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c     if( pLoop->aL
22500 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d  Term[i]->pExpr==
22510 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
22520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22530 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  Loop->aLTerm[i]-
22540 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22550 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IN) );.         
22560 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 30         bOnce = 0
22570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
225a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
225b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
225c0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
225d0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
225e0 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
225f0 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
22600 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
22610 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
22620 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
22630 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
22640 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
22650 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
22660 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
22670 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
22680 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
22690 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
226a0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
226b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
226c0 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
226d0 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
226e0 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44  olumn = XN_ROWID
226f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22700 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
22710 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  mn = XN_ROWID;. 
22720 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
22730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
22740 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
22750 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
22760 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
22770 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
22780 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
22790 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
227a0 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
227b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
227c0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
227d0 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
227e0 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
227f0 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
22800 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
22810 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
22820 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
22830 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
22840 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
22850 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
22860 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
22870 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
22880 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
22890 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
228a0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
228b0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
228c0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
228d0 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
228e0 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
228f0 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
22900 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  */.        isMat
22910 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
22920 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
22930 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
22940 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
22950 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
22960 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
22970 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
22980 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
22990 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
229a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
229b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
229c0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
229d0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
229e0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
229f0 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
22a00 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
22a10 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
22a20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
22a30 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
22a40 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
22a50 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
22a60 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
22a70 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 58    if( iColumn>=X
22a80 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
22a90 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
22aa0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
22ab0 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
22ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
22ad0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
22ae0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
22af0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22b00 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
22b10 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
22b20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
22b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22b40 20 20 20 45 78 70 72 20 2a 70 49 64 78 45 78 70     Expr *pIdxExp
22b50 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  r = pIndex->aCol
22b60 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  Expr->a[j].pExpr
22b70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22b80 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
22b90 70 61 72 65 53 6b 69 70 28 70 4f 42 45 78 70 72  pareSkip(pOBExpr
22ba0 2c 20 70 49 64 78 45 78 70 72 2c 20 69 43 75 72  , pIdxExpr, iCur
22bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
22bc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22bd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22bf0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 21 3d 58 4e   if( iColumn!=XN
22c00 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
22c10 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
22c20 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
22c30 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
22c40 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
22c50 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
22c60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22c70 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
22c80 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
22c90 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
22ca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
22cc0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49  Loop->u.btree.nI
22cd0 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20  dxCol = j+1;.   
22ce0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
22cf0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
22d00 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
22d10 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
22d20 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  ch && (wctrlFlag
22d30 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
22d40 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
22d50 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
22d60 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
22d70 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
22d80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
22d90 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se..          **
22da0 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69   Sort order is i
22db0 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20  rrelevant for a 
22dc0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
22dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22de0 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20  ( revSet ){.    
22df0 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
22e00 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
22e10 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
22e20 72 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d  rder ) isMatch =
22e30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
22e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22e50 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
22e60 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
22e70 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
22e80 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20        if( rev ) 
22e90 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53  *pRevMask |= MAS
22ea0 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20  KBIT(iLoop);.   
22eb0 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20           revSet 
22ec0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
22ed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22ee0 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29     if( isMatch )
22ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22f00 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
22f10 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
22f20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
22f30 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
22f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
22f50 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
22f60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22f70 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
22f80 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
22f90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22fa0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
22fb0 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
22fc0 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
22fd0 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
22fe0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22ff0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
23000 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
23010 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
23020 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
23030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23050 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
23060 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
23070 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
23080 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
23090 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
230a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
230b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
230c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
230d0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
230e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
230f0 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
23100 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
23110 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
23120 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
23130 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
23140 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
23150 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
23160 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
23170 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
23180 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
23190 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
231a0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
231b0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
231c0 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
231d0 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
231e0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
231f0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
23200 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
23210 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
23220 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
23230 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  mTerm = sqlite3W
23240 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70  hereExprUsage(&p
23250 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
23260 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
23270 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
23280 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
23290 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
232a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
232b0 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
232c0 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
232d0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
232e0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
232f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23300 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
23310 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
23320 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
23330 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
23340 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
23350 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
23360 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
23370 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
23380 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
23390 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
233a0 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
233b0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
233c0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
233d0 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
233e0 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
233f0 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
23400 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
23410 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23420 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
23430 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
23440 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
23450 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
23460 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
23470 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
23480 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
23490 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
234a0 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
234b0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
234c0 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
234d0 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
234e0 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
234f0 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
23500 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
23510 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
23520 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
23530 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
23540 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
23550 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
23560 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
23570 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
23580 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
23590 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
235a0 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
235b0 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
235c0 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
235d0 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
235e0 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
235f0 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
23600 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
23610 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
23620 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
23630 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23640 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
23650 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
23660 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
23670 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
23680 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
23690 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
236a0 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
236b0 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
236c0 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
236d0 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
236e0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
236f0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
23700 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
23710 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
23720 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
23730 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
23740 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
23750 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
23760 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
23770 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
23780 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
23790 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
237a0 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
237b0 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
237c0 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
237d0 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
237e0 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
237f0 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
23800 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23810 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
23820 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
23830 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23840 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
23850 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
23860 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
23870 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
23880 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
23890 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
238a0 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
238b0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
238c0 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
238d0 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
238e0 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
238f0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
23900 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
23910 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
23920 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
23930 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
23940 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
23950 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
23960 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
23970 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
23980 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
23990 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
239a0 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
239b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
239c0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
239d0 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75   nRow rows, assu
239e0 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65  ming that the ke
239f0 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64  ys have .** nOrd
23a00 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  erby columns and
23a10 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
23a20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20  nSorted columns 
23a30 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a  are already in.*
23a40 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  * order..*/.stat
23a50 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53  ic LogEst whereS
23a60 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68  ortingCost(.  Wh
23a70 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
23a80 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a  .  LogEst nRow,.
23a90 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a    int nOrderBy,.
23aa0 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b    int nSorted.){
23ab0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73  .  /* TUNING: Es
23ac0 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
23ad0 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
23ae0 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
23af0 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65   .  ** the numbe
23b00 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72  r of rows to sor
23b10 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
23b20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
23b30 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a  N * log(N))..  *
23b40 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74  * .  ** Or, if t
23b50 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75  he order-by clau
23b60 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62  se has X terms b
23b70 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74  ut only the last
23b80 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61   Y .  ** terms a
23b90 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c  re out of order,
23ba0 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74   then block-sort
23bb0 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ing will reduce 
23bc0 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e  the .  ** sortin
23bd0 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a  g cost to:.  **.
23be0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
23bf0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
23c00 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20   * (Y/X).  **.  
23c10 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
23c20 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
23c30 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
23c40 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a  iable rScale.  *
23c50 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c  * below.  */.  L
23c60 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53  ogEst rScale, rS
23c70 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72  ortCost;.  asser
23c80 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26  t( nOrderBy>0 &&
23c90 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
23ca0 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63  st(100) );.  rSc
23cb0 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
23cc0 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53  Est((nOrderBy-nS
23cd0 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65  orted)*100/nOrde
23ce0 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f  rBy) - 66;.  rSo
23cf0 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20  rtCost = nRow + 
23d00 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20  rScale + 16;..  
23d10 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c  /* Multiple by l
23d20 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73  og(M) where M is
23d30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
23d40 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a  utput rows..  **
23d50 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66   Use the LIMIT f
23d60 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d  or M if it is sm
23d70 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  aller */.  if( (
23d80 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
23d90 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
23da0 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e  IMIT)!=0 && pWIn
23db0 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20  fo->iLimit<nRow 
23dc0 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57  ){.    nRow = pW
23dd0 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  Info->iLimit;.  
23de0 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d  }.  rSortCost +=
23df0 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20   estLog(nRow);. 
23e00 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73   return rSortCos
23e10 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t;.}../*.** Give
23e20 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
23e30 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
23e40 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
23e50 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
23e60 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
23e70 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
23e80 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
23e90 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
23ea0 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
23eb0 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
23ec0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
23ed0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
23ee0 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
23ef0 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
23f00 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23f10 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
23f20 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
23f30 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
23f40 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
23f50 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
23f60 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
23f70 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
23f80 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
23f90 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
23fa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
23fb0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
23fc0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
23fd0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
23fe0 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
23ff0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24000 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
24010 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
24020 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  fo, LogEst nRowE
24030 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
24040 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
24050 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
24060 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
24070 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
24080 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
240b0 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
240c0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
240d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
240e0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
240f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24100 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24110 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24120 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24130 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
24140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
24150 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
24160 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
24170 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
24180 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
24190 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
241a0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ters */.  int mx
241b0 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  I = 0;          
241c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
241d0 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65  next entry to re
241e0 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  place */.  int n
241f0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
24200 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24210 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
24220 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67  e terms */.  Log
24230 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20  Est mxCost = 0; 
24240 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
24250 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  m cost of a set 
24260 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f  of paths */.  Lo
24270 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20  gEst mxUnsorted 
24280 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d  = 0;    /* Maxim
24290 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74  um unsorted cost
242a0 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
242b0 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  h */.  int nTo, 
242c0 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
242d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
242e0 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
242f0 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
24300 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
24310 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
24320 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
24330 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
24340 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
24350 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
24360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
24370 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
24380 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
24390 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
243a0 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
243b0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
243c0 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
243d0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
243e0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
243f0 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
24400 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
24410 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
24420 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
24430 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
24440 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
24450 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
24460 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
24470 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
24480 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
24490 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
244a0 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
244b0 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61  y */.  LogEst *a
244c0 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20  SortCost = 0;   
244d0 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20   /* Sorting and 
244e0 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20  partial sorting 
244f0 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  costs */.  char 
24500 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
24510 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
24520 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
24530 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
24540 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20  .  int nSpace;  
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24560 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  Bytes of space a
24570 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61  llocated at pSpa
24580 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ce */..  pParse 
24590 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
245a0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
245b0 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
245c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
245d0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20   /* TUNING: For 
245e0 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20  simple queries, 
245f0 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61  only the best pa
24600 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20  th is tracked.. 
24610 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f   ** For 2-way jo
24620 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20  ins, the 5 best 
24630 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77  paths are follow
24640 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69  ed..  ** For joi
24650 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20  ns of 3 or more 
24660 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68  tables, track th
24670 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20  e 10 best paths 
24680 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20  */.  mxChoice = 
24690 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a  (nLoop<=1) ? 1 :
246a0 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a   (nLoop==2 ? 5 :
246b0 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20   10);.  assert( 
246c0 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70  nLoop<=pWInfo->p
246d0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
246e0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
246f0 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69  002, ("---- begi
24700 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77  n solver.  (nRow
24710 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77  Est=%d)\n", nRow
24720 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Est));..  /* If 
24730 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20  nRowEst is zero 
24740 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
24750 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
24760 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74   ignore it. In t
24770 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  his.  ** case th
24780 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  e purpose of thi
24790 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74  s call is to est
247a0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
247b0 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
247c0 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76  d.  ** by the ov
247d0 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63  erall query. Onc
247e0 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20  e this estimate 
247f0 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
24800 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20  d, the caller.  
24810 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ** will invoke t
24820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73  his function a s
24830 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73  econd time, pass
24840 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65  ing the estimate
24850 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f   as the.  ** nRo
24860 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  wEst parameter. 
24870 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
24880 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
24890 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
248a0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
248b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
248c0 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d  rderBy = pWInfo-
248d0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
248e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
248f0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
24900 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
24910 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f  o, aFrom and aSo
24920 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53  rtCost[] */.  nS
24930 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57  pace = (sizeof(W
24940 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
24950 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
24960 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
24970 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65    nSpace += size
24980 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
24990 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20  derBy;.  pSpace 
249a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
249b0 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63  cRawNN(db, nSpac
249c0 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  e);.  if( pSpace
249d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
249e0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
249f0 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
24a00 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
24a10 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
24a20 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
24a30 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
24a40 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
24a50 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
24a60 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
24a70 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
24a80 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
24a90 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
24aa0 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
24ab0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
24ac0 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20  oop = pX;.  }.  
24ad0 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
24ae0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
24af0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
24b00 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20  lause and it is 
24b10 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65  not being ignore
24b20 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a  d, set up.    **
24b30 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
24b40 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79  SortCost[] array
24b50 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  . Each element o
24b60 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20  f the aSortCost 
24b70 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20  array.    ** is 
24b80 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65  either zero - me
24b90 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74  aning it has not
24ba0 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61   yet been initia
24bb0 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20  lized - or the. 
24bc0 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f     ** cost of so
24bd0 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f  rting nRowEst ro
24be0 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65  ws of data where
24bf0 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72   the first X ter
24c00 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ms of.    ** the
24c10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
24c20 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
24c30 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69  order, where X i
24c40 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20  s the array .   
24c50 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20   ** index.  */. 
24c60 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28     aSortCost = (
24c70 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20  LogEst*)pX;.    
24c80 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74  memset(aSortCost
24c90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45  , 0, sizeof(LogE
24ca0 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b  st) * nOrderBy);
24cb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
24cc0 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26  SortCost==0 || &
24cd0 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
24ce0 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73  (char*)&aSortCos
24cf0 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20  t[nOrderBy] );. 
24d00 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
24d10 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st!=0 || &pSpace
24d20 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
24d30 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65  )pX );..  /* See
24d40 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
24d50 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
24d60 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
24d70 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
24d80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
24d90 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
24da0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
24db0 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
24dc0 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  28.  If the cost
24dd0 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
24de0 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
24df0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
24e00 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
24e10 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20  e first 28.  ** 
24e20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
24e30 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
24e40 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
24e50 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
24e60 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
24e70 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73  ryLoop, 48);  as
24e80 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65  sert( 48==sqlite
24e90 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20  3LogEst(28) );. 
24ea0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73   nFrom = 1;.  as
24eb0 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69  sert( aFrom[0].i
24ec0 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20  sOrdered==0 );. 
24ed0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
24ee0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70  .    /* If nLoop
24ef0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
24f00 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d  here are no FROM
24f10 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75   terms in the qu
24f20 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  ery. Since.    *
24f30 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  * in this case t
24f40 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74  he query may ret
24f50 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  urn a maximum of
24f60 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65   one row, the re
24f70 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65  sults.    ** are
24f80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
24f90 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e  requested order.
24fa0 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   Set isOrdered t
24fb0 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20  o nOrderBy to.  
24fc0 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
24fd0 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70  is. Or, if nLoop
24fe0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
24ff0 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64   zero, set isOrd
25000 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d  ered to.    ** -
25010 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
25020 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  at the result se
25030 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
25040 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20   be ordered, .  
25050 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f    ** depending o
25060 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65  n the loops adde
25070 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
25080 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61   plan.  */.    a
25090 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
250a0 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31  d = nLoop>0 ? -1
250b0 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   : nOrderBy;.  }
250c0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
250d0 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
250e0 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
250f0 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
25100 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
25110 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
25120 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
25130 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
25140 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
25150 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
25160 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
25170 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
25180 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
25190 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
251a0 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
251b0 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
251c0 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
251d0 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
251e0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
251f0 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
25200 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
25210 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
25220 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
25230 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65    /* Rows visite
25260 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  d by (pFrom+pWLo
25270 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
25280 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68   /* Cost of path
252b0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
252c0 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
252d0 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20  t rUnsorted;    
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252f0 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  Unsorted cost of
25300 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
25310 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  */.        i8 is
25320 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
25330 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20  >isOrdered;  /* 
25340 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70  isOrdered for (p
25350 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
25360 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
25370 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20  maskNew;        
25380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
25390 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64  k of src visited
253a0 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20   by (..) */.    
253b0 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
253c0 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
253d0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
253e0 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73   rev-order loops
253f0 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20   for (..) */..  
25400 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
25410 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
25420 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
25430 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25440 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
25450 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
25460 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
25470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25480 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
25490 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
254a0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
254b0 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c   && pFrom->nRow<
254c0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  3 ){.          /
254d0 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20  * Do not use an 
254e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
254f0 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70  if the this loop
25500 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20 20   is expected.   
25510 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
25520 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 32 35 20   less than 1.25 
25530 74 69 6d 65 73 2e 20 20 49 74 20 69 73 20 74 65  times.  It is te
25540 6d 70 74 69 6e 67 20 74 6f 20 61 6c 73 6f 20 65  mpting to also e
25550 78 63 6c 75 64 65 0a 20 20 20 20 20 20 20 20 20  xclude.         
25560 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   ** automatic in
25570 64 65 78 20 75 73 61 67 65 20 6f 6e 20 61 6e 20  dex usage on an 
25580 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 62 75 74 20  outer loop, but 
25590 73 6f 6d 65 74 69 6d 65 73 20 61 6e 20 61 75 74  sometimes an aut
255a0 6f 6d 61 74 69 63 0a 20 20 20 20 20 20 20 20 20  omatic.         
255b0 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 75 73 65   ** index is use
255c0 66 75 6c 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ful in the outer
255d0 20 6c 6f 6f 70 20 6f 66 20 61 20 63 6f 72 72 65   loop of a corre
255e0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20  lated subquery. 
255f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
25600 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
25610 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
25620 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
25630 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
25640 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
25650 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
25660 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
25670 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
25680 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
25690 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
256a0 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
256b0 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
256c0 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
256d0 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
256e0 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
256f0 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
25700 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
25710 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
25720 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
25730 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
25740 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
25750 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
25760 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
25770 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
25780 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
25790 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
257a0 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
257b0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
257c0 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
257d0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
257e0 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25810 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
25820 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
25850 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
25860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25870 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
25880 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
25890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
258a0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
258b0 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
258c0 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
258d0 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
258e0 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
258f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25900 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
25910 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
25920 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
25930 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
25940 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
25950 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
25960 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
25970 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25980 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
25990 20 41 64 64 20 61 20 73 6d 61 6c 6c 20 65 78 74   Add a small ext
259a0 72 61 20 70 65 6e 61 6c 74 79 20 28 35 29 20 74  ra penalty (5) t
259b0 6f 20 73 6f 72 74 69 6e 67 20 61 73 20 61 6e 0a  o sorting as an.
259c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 74            ** ext
259d0 72 61 20 65 6e 63 6f 75 72 61 67 6d 65 6e 74 20  ra encouragment 
259e0 74 6f 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  to the query pla
259f0 6e 6e 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61  nner to select a
25a00 20 70 6c 61 6e 0a 20 20 20 20 20 20 20 20 20 20   plan.          
25a10 2a 2a 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  ** where the row
25a20 73 20 65 6d 65 72 67 65 20 69 6e 20 74 68 65 20  s emerge in the 
25a30 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 77 69  correct order wi
25a40 74 68 6f 75 74 20 61 6e 79 20 73 6f 72 74 69 6e  thout any sortin
25a50 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  g.          ** r
25a60 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
25a70 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
25a80 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
25a90 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43  Unsorted, aSortC
25aa0 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 20  ost[isOrdered]) 
25ab0 2b 20 35 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  + 5;..          
25ac0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
25ad0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25ae0 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
25af0 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
25b00 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
25b10 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
25b20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
25b30 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
25b40 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72  , (nOrderBy-isOr
25b50 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79  dered), nOrderBy
25b60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
25b70 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f    rUnsorted, rCo
25b80 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  st));.        }e
25b90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
25ba0 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64  Cost = rUnsorted
25bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 55 6e 73  ;.          rUns
25bc0 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20 2f 2a 20  orted -= 2;  /* 
25bd0 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67 68 74 20  TUNING:  Slight 
25be0 62 69 61 73 20 69 6e 20 66 61 76 6f 72 20 6f 66  bias in favor of
25bf0 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e 73 20 2a   no-sort plans *
25c00 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  /.        }..   
25c10 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
25c20 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
25c30 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
25c40 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20  o the set of.   
25c50 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65       ** mxChoice
25c60 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
25c70 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  hs..        **. 
25c80 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20         ** First 
25c90 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  look for an exis
25ca0 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20  ting path among 
25cb0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
25cc0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
25cd0 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d  t covers the sam
25ce0 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
25cf0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
25d00 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
25d10 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20    ** setting as 
25d20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68  the current path
25d30 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20   candidate..    
25d40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25d50 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54  * The term "((pT
25d60 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
25d70 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
25d80 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a  " is equivalent.
25d90 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70          ** to (p
25da0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28  To->isOrdered==(
25db0 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64  -1))==(isOrdered
25dc0 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65  ==(-1))" for the
25dd0 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
25de0 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65  * of legal value
25df0 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c  s for isOrdered,
25e00 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20   -1..64..       
25e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
25e20 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
25e30 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
25e40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
25e50 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
25e60 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
25e70 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69       && ((pTo->i
25e80 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
25e90 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20  ed)&0x80)==0.   
25ea0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
25eb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25ec0 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
25ed0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25ee0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25f00 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
25f10 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f         /* None o
25f20 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  f the existing b
25f30 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
25f40 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69   match the candi
25f50 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  date. */.       
25f60 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
25f70 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
25f80 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74  && (rCost>mxCost
25f90 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f   || (rCost==mxCo
25fa0 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e  st && rUnsorted>
25fb0 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20  =mxUnsorted)).  
25fc0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
25fe0 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20  rrent candidate 
25ff0 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61  is no better tha
26000 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43  n any of the mxC
26010 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
26020 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65    ** paths curre
26030 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74  ntly in the best
26040 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20  -so-far buffer. 
26050 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20   So discard.    
26060 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
26070 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74  candidate as not
26080 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64   viable. */.#ifd
26090 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
260a0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
260b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
260c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
260d0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
260e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
260f0 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
26100 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
26110 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
26120 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
26130 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
26140 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
26150 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
26160 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65  , nOut, rUnsorte
26170 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26180 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
26190 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
261a0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
261b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
261c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
261d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
261e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
261f0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
26200 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
26210 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
26220 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
26230 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
26240 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
26250 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
26260 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
26270 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
26280 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
26290 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
262a0 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
262b0 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
262c0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
262d0 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
262e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
262f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
26300 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
26310 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
26320 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
26330 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
26340 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
26350 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
26360 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
26370 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
26380 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
26390 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
263a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
263b0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
263c0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
263d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
263e0 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
263f0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
26400 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
26430 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
26440 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
26450 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20  , rUnsorted,.   
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
26470 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
26480 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
26490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
264a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
264b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
264c0 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
264d0 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f   here if best-so
264e0 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54  -far path pTo=aT
264f0 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65  o[jj] covers the
26500 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
26510 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
26520 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
26530 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
26540 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
26550 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
26560 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
26570 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
26580 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
26590 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
265a0 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
265b0 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
265c0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
265d0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
265e0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6e 64       ** The cond
265f0 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e 20 65 78  itional is an ex
26600 70 61 6e 64 65 64 20 76 65 63 74 6f 72 20 63 6f  panded vector co
26610 6d 70 61 72 69 73 6f 6e 20 65 71 75 69 76 61 6c  mparison equival
26620 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20  ent to:.        
26630 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e 72 43 6f    **   (pTo->rCo
26640 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70 54 6f  st,pTo->nRow,pTo
26650 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20 3c 3d 20  ->rUnsorted) <= 
26660 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72 55 6e 73  (rCost,nOut,rUns
26670 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20 20  orted).         
26680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
26690 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
266a0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
266b0 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  | (pTo->rCost==r
266c0 43 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  Cost.           
266d0 20 20 20 20 26 26 20 28 70 54 6f 2d 3e 6e 52 6f      && (pTo->nRo
266e0 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20 20 20 20  w<nOut.         
266f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
26700 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20 26 26  o->nRow==nOut &&
26710 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3c   pTo->rUnsorted<
26720 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20  =rUnsorted).    
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
26750 20 20 20 20 20 20 20 20 20 20 29 7b 0a 23 69 66            ){.#if
26760 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
26770 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
26780 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26790 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
267a0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
267b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
267c0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
267e0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
267f0 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
26800 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
26810 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
26820 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
26830 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
26840 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72  st, nOut, rUnsor
26850 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26860 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
26870 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
26880 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
26890 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
268a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
268b0 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64   vs %s cost=%-3d
268c0 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
268d0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
268e0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
268f0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
26900 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
26910 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26930 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c   pTo->rUnsorted,
26940 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
26950 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
26960 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26970 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
26980 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
26990 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
269a0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66  candidate path f
269b0 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73  rom further cons
269c0 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  ideration */.   
269d0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
269e0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
269f0 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
26a00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
26a30 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
26a40 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
26a50 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
26a60 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61  s here if the ca
26a70 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20  ndidate path is 
26a80 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a  better than the.
26a90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
26aa0 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20   path.  Replace 
26ab0 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e  pTo with the can
26ac0 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65  didate. */.#ifde
26ad0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26ae0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
26af0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
26b00 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
26b10 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
26b20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26b30 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
26b40 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
26b50 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
26b60 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
26b80 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
26b90 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
26ba0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20  ), rCost, nOut, 
26bb0 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20  rUnsorted,.     
26bc0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
26bd0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
26be0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26c00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26c10 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
26c20 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
26c30 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
26c40 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
26c50 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
26c60 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
26c70 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26c90 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70  To->rUnsorted, p
26ca0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
26cb0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
26cc0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
26cd0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
26ce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26cf0 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
26d00 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
26d10 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
26d20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
26d30 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
26d40 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
26d50 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
26d60 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
26d70 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
26d80 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
26d90 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
26da0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
26db0 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
26dc0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
26dd0 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
26de0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
26df0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
26e00 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
26e10 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
26e20 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
26e30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
26e40 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
26e50 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
26e60 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
26e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
26e80 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
26e90 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
26ea0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
26eb0 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
26ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
26ed0 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
26ee0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
26ef0 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
26f00 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
26f10 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
26f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
26f30 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
26f40 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
26f50 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
26f60 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
26f70 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
26f80 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
26f90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26fa0 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
26fb0 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
26fc0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
26fd0 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
26fe0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
26ff0 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
27000 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
27030 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
27040 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
27050 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
27060 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
27070 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73   0x02 ){.      s
27080 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27090 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
270a0 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
270b0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
270c0 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
270d0 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
270e0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
270f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27100 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
27110 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
27120 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
27130 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
27140 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
27150 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
27160 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
27170 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
27180 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
27190 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
271a0 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
271b0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
271c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
271d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
271e0 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
271f0 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
27200 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27210 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27220 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
27230 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
27240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
27250 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
27260 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
27270 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
27280 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
27290 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
272a0 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
272b0 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
272c0 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
272d0 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
272e0 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
272f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
27300 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27310 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
27320 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
27330 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70  DbFreeNN(db, pSp
27340 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
27350 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27360 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
27370 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
27380 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
27390 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
273a0 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
273b0 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
273c0 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
273d0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
273e0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
273f0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
27400 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
27410 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
27420 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
27430 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
27440 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
27450 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
27460 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
27470 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
27480 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
27490 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
274a0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
274b0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
274c0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
274d0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
274e0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
274f0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
27500 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
27510 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
27520 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
27530 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
27540 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
27550 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
27560 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
27570 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
27580 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
27590 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
275a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
275b0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
275c0 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
275d0 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
275e0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
275f0 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
27600 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
27610 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
27620 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
27630 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
27640 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
27650 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
27660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27670 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
27680 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
27690 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
276a0 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
276b0 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
276c0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e  fo->pResultSet->
276d0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
276e0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
276f0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
27700 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
27710 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 62  .  }.  pWInfo->b
27720 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
27730 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e   = 0;.  if( pWIn
27740 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
27750 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
27760 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27770 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
27780 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
27790 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
277a0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
277b0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
277c0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
277d0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
277e0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
277f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27800 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
27810 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
27820 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70 57  rdered;.      pW
27830 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
27840 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
27850 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
27860 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20  ->nOBSat<=0 ){. 
27870 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e         pWInfo->n
27880 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
27890 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29     if( nLoop>0 )
278a0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
278b0 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d 2d  wsFlags = pFrom-
278c0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d  >aLoop[nLoop-1]-
278d0 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
278e0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
278f0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
27900 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
27910 26 26 20 28 77 73 46 6c 61 67 73 26 28 57 48 45  && (wsFlags&(WHE
27920 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c  RE_IPK|WHERE_COL
27930 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45 52 45  UMN_IN))!=(WHERE
27940 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  _IPK|WHERE_COLUM
27950 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20  N_IN).          
27960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
27970 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
27980 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63            int rc
27990 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
279a0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
279b0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
279c0 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a 20 20  derBy, pFrom,.  
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279e0 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45 52 42      WHERE_ORDERB
279f0 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31  Y_LIMIT, nLoop-1
27a00 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
27a10 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20  Loop-1], &m);.  
27a20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27a30 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
27a40 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20 20 20  ERE_IPK );.     
27a50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27a60 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
27a70 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
27a80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27a90 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
27aa0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
27ab0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
27ac0 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
27ad0 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Loop = 1;.      
27ae0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
27af0 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20  revMask = m;.   
27b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27b30 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
27b40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27b50 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
27b60 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
27b70 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
27b80 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
27b90 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
27ba0 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
27bb0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
27bc0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
27bd0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
27be0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
27bf0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
27c00 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
27c10 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
27c20 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
27c30 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
27c40 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
27c50 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
27c60 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
27c70 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
27c80 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
27c90 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
27ca0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
27cb0 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
27cc0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
27cd0 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
27ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
27cf0 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
27d00 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
27d10 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
27d20 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
27d30 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
27d40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
27d50 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65  reeNN(db, pSpace
27d60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27d70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27d80 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
27d90 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
27da0 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
27db0 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
27dc0 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
27dd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
27de0 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
27df0 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
27e00 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
27e10 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
27e20 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
27e30 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
27e40 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
27e50 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
27e60 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
27e70 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
27e80 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
27e90 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
27ea0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
27eb0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
27ec0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
27ed0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
27ee0 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
27ef0 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
27f00 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
27f10 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
27f20 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
27f30 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
27f40 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
27f50 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
27f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27f70 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
27f80 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
27f90 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
27fa0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
27fb0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27fc0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
27fd0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
27fe0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
27ff0 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
28000 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
28010 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
28020 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
28030 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70  ndex *pIdx;..  p
28040 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
28050 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
28060 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
28070 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
28080 42 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e  BCLAUSE ) return
28090 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
280a0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
280b0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
280c0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
280d0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
280e0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
280f0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
28100 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
28110 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
28120 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
28130 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
28140 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
28150 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
28160 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
28170 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
28180 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
28190 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
281a0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
281b0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
281c0 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
281d0 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
281e0 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
281f0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
28200 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
28210 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28220 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
28230 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
28240 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
28250 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
28260 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
28270 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
28280 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
28290 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
282a0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
282b0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
282c0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
282d0 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
282e0 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
282f0 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
28300 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
28310 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
28320 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
28330 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
28340 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
28350 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
28360 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
28370 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
28380 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
28390 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
283a0 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
283b0 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
283c0 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
283d0 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
283e0 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
283f0 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
28400 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
28410 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
28420 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
28430 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
28440 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
28450 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
28460 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
28470 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
28480 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
28490 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
284a0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
284b0 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b  ur, j, 0, opMask
284c0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
284d0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
284e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
284f0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28500 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28510 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
28520 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
28530 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
28540 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
28550 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
28560 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
28570 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
28580 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
28590 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
285a0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
285b0 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
285c0 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
285d0 6f 6c 55 73 65 64 20 26 20 70 49 64 78 2d 3e 63  olUsed & pIdx->c
285e0 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d 30 20 29  olNotIdxed)==0 )
285f0 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
28600 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28610 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
28620 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
28630 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
28640 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
28650 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
28660 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
28670 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
28680 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28690 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
286a0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
286b0 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
286c0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
286d0 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 39==sqlite3Lo
286e0 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  gEst(15) */.    
286f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28700 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
28710 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
28720 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
28730 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e  gEst)1;.    pWIn
28740 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20  fo->a[0].pWLoop 
28750 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73  = pLoop;.    ass
28760 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61  ert( pWInfo->sMa
28770 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43  skSet.n==1 && iC
28780 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ur==pWInfo->sMas
28790 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20  kSet.ix[0] );.  
287a0 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
287b0 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65  f = 1; /* sqlite
287c0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
287d0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
287e0 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70   iCur); */.    p
287f0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
28800 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
28810 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
28820 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
28830 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
28840 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
28850 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
28860 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
28870 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
28880 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
28890 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
288a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
288b0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
288c0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
288d0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
288e0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
288f0 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
28900 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
28910 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
28920 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  n 0;.}../*.** He
28930 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
28940 72 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  r exprIsDetermin
28950 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  istic()..*/.stat
28960 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
28970 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 57  sDeterministic(W
28980 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28990 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
289a0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
289b0 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78  K_FUNCTION && Ex
289c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
289d0 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74 46 75 6e  xpr, EP_ConstFun
289e0 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 57 61  c)==0 ){.    pWa
289f0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
28a00 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
28a10 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
28a20 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28a30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28a40 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 65 78  n true if the ex
28a50 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
28a60 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  s no non-determi
28a70 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a 2a 20 66  nistic SQL .** f
28a80 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74  unctions. Do not
28a90 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d 64 65   consider non-de
28aa0 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20  terministic SQL 
28ab0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
28ac0 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f 66 20 73  re .** part of s
28ad0 75 62 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ub-select statem
28ae0 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
28af0 69 6e 74 20 65 78 70 72 49 73 44 65 74 65 72 6d  int exprIsDeterm
28b00 69 6e 69 73 74 69 63 28 45 78 70 72 20 2a 70 29  inistic(Expr *p)
28b10 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
28b20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
28b30 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
28b40 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
28b50 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
28b60 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69  rNodeIsDetermini
28b70 73 74 69 63 3b 0a 20 20 77 2e 78 53 65 6c 65 63  stic;.  w.xSelec
28b80 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
28b90 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
28ba0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  l;.  sqlite3Walk
28bb0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
28bc0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
28bd0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
28be0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
28bf0 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
28c00 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
28c10 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
28c20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
28c30 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
28c40 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
28c50 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
28c60 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
28c70 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
28c80 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
28c90 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
28ca0 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
28cb0 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
28cc0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
28cd0 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
28ce0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
28cf0 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
28d00 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
28d10 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
28d20 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
28d30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
28d40 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
28d50 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
28d60 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
28d70 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
28d80 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
28d90 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
28da0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
28db0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
28dc0 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
28dd0 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
28de0 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
28df0 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
28e00 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
28e10 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
28e20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
28e30 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
28e40 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
28e50 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
28e60 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
28e70 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
28e80 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
28e90 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
28ea0 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
28eb0 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
28ec0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
28ed0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
28ee0 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
28ef0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
28f00 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
28f10 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
28f20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
28f30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28f40 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
28f50 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
28f60 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
28f70 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
28f80 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28fa0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
28fb0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fd0 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
28fe0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
28ff0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
29020 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
29030 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
29040 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
29050 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
29060 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
29070 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
29080 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
29090 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
290a0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
290b0 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
290c0 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
290d0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
290e0 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
290f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
29100 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
29110 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
29120 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
29130 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
29140 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
29150 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
29160 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
29170 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
29180 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
29190 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
291a0 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
291b0 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
291c0 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
291d0 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
291e0 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
291f0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
29200 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
29210 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
29220 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
29230 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
29240 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
29250 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
29260 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
29270 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
29280 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
29290 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
292a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
292b0 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
292c0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
292d0 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
292e0 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
292f0 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
29300 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
29310 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
29320 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
29330 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
29340 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
29350 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
29360 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
29370 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
29380 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
29390 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
293a0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
293b0 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
293c0 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
293d0 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
293e0 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
293f0 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
29400 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
29410 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
29420 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
29430 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
29440 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
29450 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
29460 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
29470 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
29480 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
29490 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
294a0 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
294b0 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
294c0 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
294d0 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
294e0 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
294f0 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
29500 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
29510 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
29520 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
29530 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
29540 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
29550 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
29560 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
29570 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
29580 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
29590 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
295a0 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
295b0 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
295c0 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
295d0 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
295e0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
295f0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
29600 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
29610 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
29620 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
29630 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
29640 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
29650 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
29660 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
29670 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
29680 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
29690 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
296a0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
296b0 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
296c0 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
296d0 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
296e0 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
296f0 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
29700 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
29710 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
29720 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
29730 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
29740 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
29750 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
29760 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
29770 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
29780 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
29790 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
297a0 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
297b0 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
297c0 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
297d0 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
297e0 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
297f0 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
29800 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
29810 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
29820 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
29830 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
29840 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
29850 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29860 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29870 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
29880 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
29890 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
298a0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
298b0 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
298c0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
298d0 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
298e0 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
298f0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
29900 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
29910 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
29920 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
29930 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
29940 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
29950 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
29960 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
29970 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
29980 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
29990 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
299a0 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   If .** WHERE_OR
299b0 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
299c0 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68  t, iIdxCur is th
299d0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
299e0 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74  of an index.** t
299f0 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61  o use for OR cla
29a00 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
29a10 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
29a20 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69  e should use thi
29a30 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75  s.** specific cu
29a40 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f  rsor.  If WHERE_
29a50 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
29a60 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64  is set, then iId
29a70 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66  xCur is.** the f
29a80 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61  irst cursor in a
29a90 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f  n array of curso
29aa0 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  rs for all indic
29ab0 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f  es.  iIdxCur sho
29ac0 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  uld.** be used t
29ad0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70  o compute the ap
29ae0 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72  propriate cursor
29af0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
29b00 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20  ich index is.** 
29b10 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  used..*/.WhereIn
29b20 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
29b30 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
29b40 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29b50 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
29b60 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
29b70 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
29b80 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
29b90 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
29ba0 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
29bb0 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
29bc0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
29bd0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
29be0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
29bf0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
29c00 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52       /* An ORDER
29c10 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
29c20 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
29c30 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
29c40 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 20 20 2f  *pResultSet,   /
29c50 2a 20 51 75 65 72 79 20 72 65 73 75 6c 74 20 73  * Query result s
29c60 65 74 2e 20 20 52 65 71 27 64 20 66 6f 72 20 44  et.  Req'd for D
29c70 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36  ISTINCT */.  u16
29c80 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
29c90 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
29ca0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
29cb0 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
29cc0 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72   */.  int iAuxAr
29cd0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
29ce0 20 49 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   If WHERE_OR_SUB
29cf0 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
29d00 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
29d10 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
29d30 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  If WHERE_USE_LIM
29d40 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d  IT, then the lim
29d50 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a  it amount */.){.
29d60 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
29d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29d80 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
29d90 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
29da0 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
29db0 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
29dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29dd0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
29de0 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
29df0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
29e00 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
29e10 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
29e20 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
29e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
29e40 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
29e50 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
29e60 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
29e70 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
29e80 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
29e90 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
29ea0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
29eb0 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
29ec0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
29ed0 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
29ee0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
29ef0 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
29f00 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
29f10 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
29f20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
29f30 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
29f40 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
29f50 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
29f60 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
29f70 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  fo->a[] */.  Whe
29f80 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
29f90 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29fa0 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57  er to a single W
29fb0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
29fc0 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
29ff0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2a000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a010 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2a020 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
2a030 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2a040 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a050 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46   code */.  u8 bF
2a060 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  ordelete = 0;   
2a070 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f        /* OPFLAG_
2a080 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72  FORDELETE or zer
2a090 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  o, as appropriat
2a0a0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2a0b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a0c0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
2a0d0 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20  IROW)==0 || (.  
2a0e0 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67        (wctrlFlag
2a0f0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2a100 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
2a110 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2a120 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2a130 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20 20 29  BCLAUSE)==0 .  )
2a140 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  );..  /* Only on
2a150 65 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f 53 55  e of WHERE_OR_SU
2a160 42 43 4c 41 55 53 45 20 6f 72 20 57 48 45 52 45  BCLAUSE or WHERE
2a170 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  _USE_LIMIT */.  
2a180 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
2a190 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2a1a0 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
2a1b0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
2a1c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a1d0 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  USE_LIMIT)==0 );
2a1e0 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
2a1f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
2a200 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
2a210 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
2a220 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
2a230 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
2a240 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
2a250 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
2a260 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
2a270 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
2a280 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
2a290 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
2a2a0 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
2a2b0 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
2a2c0 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
2a2d0 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
2a2e0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
2a2f0 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
2a300 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
2a310 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
2a320 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
2a330 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
2a340 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
2a350 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
2a360 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
2a370 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2a380 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
2a390 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
2a3a0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
2a3b0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
2a3c0 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
2a3d0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
2a3e0 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
2a3f0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
2a400 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
2a410 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2a420 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
2a430 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
2a440 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
2a450 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
2a460 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
2a470 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
2a480 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
2a490 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
2a4a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2a4b0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
2a4c0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
2a4d0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
2a4e0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
2a4f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
2a500 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
2a510 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
2a520 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
2a530 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
2a540 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
2a550 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66  E_OR_SUBCLAUSE f
2a560 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
2a570 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
2a580 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
2a590 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
2a5a0 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
2a5b0 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
2a5c0 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
2a5d0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
2a5e0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
2a5f0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
2a600 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
2a610 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
2a620 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a630 52 5f 53 55 42 43 4c 41 55 53 45 29 20 3f 20 31  R_SUBCLAUSE) ? 1
2a640 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
2a650 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
2a660 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2a670 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
2a680 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
2a690 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
2a6a0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
2a6b0 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
2a6c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2a6d0 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
2a6e0 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
2a6f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a700 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
2a710 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
2a720 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
2a730 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
2a740 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
2a750 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
2a760 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
2a770 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
2a780 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
2a790 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
2a7a0 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
2a7b0 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
2a7c0 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
2a7d0 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
2a7e0 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
2a7f0 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  /.  nByteWInfo =
2a800 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
2a810 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
2a820 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
2a830 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
2a840 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
2a850 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
2a860 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
2a870 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
2a880 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2a890 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
2a8a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2a8b0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
2a8c0 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
2a8d0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2a8e0 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
2a8f0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
2a900 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
2a910 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
2a920 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
2a930 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
2a940 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72  .  pWInfo->pWher
2a950 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 57  e = pWhere;.  pW
2a960 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
2a970 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
2a980 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2a990 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
2a9a0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2a9b0 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
2a9c0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
2a9d0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2a9e0 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
2a9f0 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
2aa00 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2aa10 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
2aa20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
2aa30 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
2aa40 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
2aa50 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
2aa60 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
2aa70 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2aa80 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  oop;.  memset(&p
2aa90 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30  WInfo->nOBSat, 0
2aaa0 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73  , .         offs
2aab0 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73  etof(WhereInfo,s
2aac0 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57  WC) - offsetof(W
2aad0 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29  hereInfo,nOBSat)
2aae0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  );.  memset(&pWI
2aaf0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  nfo->a[0], 0, si
2ab00 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b  zeof(WhereLoop)+
2ab10 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28  nTabList*sizeof(
2ab20 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2ab30 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2ab40 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2ab50 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45  S_OFF );  /* ONE
2ab60 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f  PASS defaults to
2ab70 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53   OFF */.  pMaskS
2ab80 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
2ab90 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
2aba0 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
2abb0 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
2abc0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
2abd0 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
2abe0 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
2abf0 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
2ac00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2ac10 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2ac20 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
2ac30 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
2ac40 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
2ac50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ac60 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
2ac70 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
2ac80 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
2ac90 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
2aca0 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
2acb0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
2acc0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
2acd0 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
2ace0 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
2acf0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
2ad00 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
2ad10 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  Set);.  sqlite3W
2ad20 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
2ad30 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
2ad40 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  nfo);.  sqlite3W
2ad50 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
2ad60 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
2ad70 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
2ad80 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
2ad90 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
2ada0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
2adb0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
2adc0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
2add0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
2ade0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2adf0 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
2ae00 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2ae10 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
2ae20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2ae30 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2ae40 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
2ae50 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  }.    ExplainQue
2ae60 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
2ae70 30 2c 20 22 53 43 41 4e 20 43 4f 4e 53 54 41 4e  0, "SCAN CONSTAN
2ae80 54 20 52 4f 57 22 29 29 3b 0a 20 20 7d 65 6c 73  T ROW"));.  }els
2ae90 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  e{.    /* Assign
2aea0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2aeb0 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2aec0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2aed0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  M clause..    **
2aee0 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68  .    ** The N-th
2aef0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
2af00 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69  M clause is assi
2af10 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f  gned a bitmask o
2af20 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a 0a 20  f 1<<N..    **. 
2af30 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f     ** The rule o
2af40 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
2af50 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
2af60 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
2af70 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 20   bitmask for.   
2af80 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74   ** a table T, t
2af90 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62  hen X-1 is the b
2afa0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f  itmask for all o
2afb0 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74  ther tables to t
2afc0 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20  he left of T..  
2afd0 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
2afe0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2aff0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2b000 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2b010 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d 70  in is.    ** imp
2b020 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2b030 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a 20 20  #3015..    **.  
2b040 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2b050 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2b060 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2b070 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2b080 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54 61 62  s in.    ** pTab
2b090 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
2b0a0 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
2b0b0 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
2b0c0 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
2b0d0 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20      ** equal to 
2b0e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
2b0f0 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
2b100 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
2b110 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 5f 4f  e.    ** WHERE_O
2b120 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
2b130 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a   is set..    */.
2b140 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20 20 20      ii = 0;.    
2b150 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65  do{.      create
2b160 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2b170 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2b180 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
2b190 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75  qlite3WhereTabFu
2b1a0 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26  ncArgs(pParse, &
2b1b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c  pTabList->a[ii],
2b1c0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
2b1d0 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 69      }while( (++i
2b1e0 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  i)<pTabList->nSr
2b1f0 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51  c );.  #ifdef SQ
2b200 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
2b210 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2b220 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  x = 0;.      for
2b230 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
2b240 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
2b250 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2b260 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
2b270 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
2b280 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2b290 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2b2a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e 3d       assert( m>=
2b2b0 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 78  mx );.        mx
2b2c0 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = m;.      }.  
2b2d0 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
2b2e0 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  .  .  /* Analyze
2b2f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2b300 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2b310 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2b320 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
2b330 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
2b340 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2b350 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2b360 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2b370 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
2b380 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d 73  ase: WHERE terms
2b390 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 66   that do not ref
2b3a0 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 73  er to any tables
2b3b0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20 2a   in the join.  *
2b3c0 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  * (constant expr
2b3d0 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75 61  essions). Evalua
2b3e0 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65 72  te each such ter
2b3f0 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65 72  m, and jump over
2b400 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67 65   all the.  ** ge
2b410 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66 20  nerated code if 
2b420 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
2b430 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a 20  t true.  .  **. 
2b440 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   ** Do not do th
2b450 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65 73  is if the expres
2b460 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
2b470 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
2b480 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74  functions.  ** t
2b490 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68  hat are not with
2b4a0 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  in a sub-select.
2b4b0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74 72   This is not str
2b4c0 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c 20  ictly required, 
2b4d0 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72 76  but.  ** preserv
2b4e0 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67 61  es SQLite's lega
2b4f0 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  cy behaviour in 
2b500 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2b510 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20 20  o cases:.  **.  
2b520 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  **   FROM ... WH
2b530 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b 20  ERE random()>0; 
2b540 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76 61            -- eva
2b550 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20  l random() once 
2b560 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20 46  per row.  **   F
2b570 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28 53  ROM ... WHERE (S
2b580 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29 3e  ELECT random())>
2b590 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64  0;  -- eval rand
2b5a0 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61 6c  om() once overal
2b5b0 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  l.  */.  for(ii=
2b5c0 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
2b5d0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2b5e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 20    WhereTerm *pT 
2b5f0 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  = &sWLB.pWC->a[i
2b600 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e  i];.    if( pT->
2b610 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2b620 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75  IRTUAL ) continu
2b630 65 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e 70  e;.    if( pT->p
2b640 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26 20 28  rereqAll==0 && (
2b650 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 65  nTabList==0 || e
2b660 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74  xprIsDeterminist
2b670 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29 20 29  ic(pT->pExpr)) )
2b680 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2b690 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2b6a0 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20 70 57  e, pT->pExpr, pW
2b6b0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2b6c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2b6d0 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74 46 6c  ;.      pT->wtFl
2b6e0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2b6f0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
2b700 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2b710 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2b720 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
2b730 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
2b740 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
2b750 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
2b760 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
2b770 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2b780 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
2b790 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
2b7a0 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
2b7b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2b7c0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2b7d0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2b7e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
2b7f0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
2b800 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
2b810 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
2b820 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
2b830 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
2b840 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
2b850 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b860 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
2b870 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
2b880 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
2b890 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
2b8a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
2b8b0 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
2b8c0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2b8d0 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
2b8e0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
2b8f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2b900 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66 66  reTrace & 0xffff
2b910 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2b920 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20  ebugPrintf("*** 
2b930 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
2b940 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a  *** (wctrlFlags:
2b950 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61 67   0x%x",wctrlFlag
2b960 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  s);.    if( wctr
2b970 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
2b980 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  SE_LIMIT ){.    
2b990 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2b9a0 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25  intf(", limit: %
2b9b0 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20 20  d", iAuxArg);.  
2b9c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2b9d0 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e 22  ebugPrintf(")\n"
2b9e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
2b9f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2ba00 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73   0x100 ){ /* Dis
2ba10 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
2ba20 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2ba30 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
2ba40 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
2ba50 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d  t(sWLB.pWC);.  }
2ba60 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
2ba70 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
2ba80 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
2ba90 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
2baa0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
2bab0 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
2bac0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
2bad0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
2bae0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2baf0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
2bb00 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2bb10 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73  ace ){    /* Dis
2bb20 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
2bb30 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2bb40 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65  s */.      Where
2bb50 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
2bb60 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
2bb70 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c  ic const char zL
2bb80 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35  abel[] = "012345
2bb90 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c  6789abcdefghijkl
2bba0 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a  mnopqrstuvwyxz".
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
2bbe0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2bbf0 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
2bc00 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
2bc10 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
2bc20 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
2bc30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
2bc40 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 28  cId = zLabel[i%(
2bc50 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2d 31  sizeof(zLabel)-1
2bc60 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
2bc70 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
2bc80 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
2bc90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2bca0 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
2bcb0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
2bcc0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2bcd0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2bce0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2bcf0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2bd00 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
2bd10 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
2bd20 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
2bd30 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
2bd40 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
2bd50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2bd60 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2bd70 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
2bd80 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
2bd90 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
2bda0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2bdb0 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
2bdc0 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
2bdd0 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49  >revMask = ALLBI
2bde0 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  TS;.  }.  if( pP
2bdf0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
2be00 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
2be10 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
2be20 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2be30 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
2be40 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2be50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2be60 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
2be70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2be80 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
2be90 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
2bea0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
2beb0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
2bec0 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
2bed0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2bee0 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
2bef0 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
2bf00 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
2bf10 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
2bf20 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
2bf30 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
2bf40 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
2bf50 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2bf60 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
2bf70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2bf80 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
2bf90 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
2bfa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2bfb0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
2bfc0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
2bfd0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2bfe0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2bff0 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
2c000 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
2c010 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2c020 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
2c030 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
2c040 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2c050 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2c060 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
2c070 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
2c080 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2c090 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2c0a0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
2c0b0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2c0c0 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
2c0d0 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
2c0e0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2c0f0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
2c100 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
2c110 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c120 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
2c130 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72  o omit tables fr
2c140 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74  om the join that
2c150 20 64 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74   do not affect t
2c160 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2a 20  he result..  ** 
2c170 46 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 20 6e  For a table to n
2c180 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72 65  ot affect the re
2c190 73 75 6c 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  sult, the follow
2c1a0 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75 65  ing must be true
2c1b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29  :.  **.  **   1)
2c1c0 20 54 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   The query must 
2c1d0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
2c1e0 61 74 65 2e 0a 20 20 2a 2a 20 20 20 32 29 20 54  ate..  **   2) T
2c1f0 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
2c200 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45   the RHS of a LE
2c210 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 20 20 20  FT JOIN..  **   
2c220 33 29 20 45 69 74 68 65 72 20 74 68 65 20 71 75  3) Either the qu
2c230 65 72 79 20 6d 75 73 74 20 62 65 20 44 49 53 54  ery must be DIST
2c240 49 4e 43 54 2c 20 6f 72 20 65 6c 73 65 20 74 68  INCT, or else th
2c250 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2c260 61 75 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d  ause.  **      m
2c270 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f  ust contain a co
2c280 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 6c 69  nstraint that li
2c290 6d 69 74 73 20 74 68 65 20 73 63 61 6e 20 6f 66  mits the scan of
2c2a0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 0a 20   the table to . 
2c2b0 20 2a 2a 20 20 20 20 20 20 61 74 20 6d 6f 73 74   **      at most
2c2c0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
2c2d0 20 2a 2a 20 20 20 34 29 20 54 68 65 20 74 61 62   **   4) The tab
2c2e0 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 72  le must not be r
2c2f0 65 66 65 72 65 6e 63 65 64 20 62 79 20 61 6e 79  eferenced by any
2c300 20 70 61 72 74 20 6f 66 20 74 68 65 20 71 75 65   part of the que
2c310 72 79 20 61 70 61 72 74 0a 20 20 2a 2a 20 20 20  ry apart.  **   
2c320 20 20 20 66 72 6f 6d 20 69 74 73 20 6f 77 6e 20     from its own 
2c330 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61 75  USING or ON clau
2c340 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  se..  **.  ** Fo
2c350 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
2c360 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2c370 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2c380 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ipk INTEGER PRIM
2c390 41 52 59 20 4b 45 59 2c 20 76 31 29 3b 0a 20 20  ARY KEY, v1);.  
2c3a0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2c3b0 42 4c 45 20 74 32 28 69 70 6b 20 49 4e 54 45 47  BLE t2(ipk INTEG
2c3c0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2c3d0 76 32 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  v2);.  **     CR
2c3e0 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 69 70  EATE TABLE t3(ip
2c3f0 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2c400 59 20 4b 45 59 2c 20 76 33 29 3b 0a 20 20 2a 2a  Y KEY, v3);.  **
2c410 0a 20 20 2a 2a 20 74 68 65 6e 20 74 61 62 6c 65  .  ** then table
2c420 20 74 32 20 63 61 6e 20 62 65 20 6f 6d 69 74 74   t2 can be omitt
2c430 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c  ed from the foll
2c440 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
2c450 20 20 20 20 20 53 45 4c 45 43 54 20 76 31 2c 20       SELECT v1, 
2c460 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a  v3 FROM t1 .  **
2c470 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e         LEFT JOIN
2c480 20 74 32 20 55 53 49 4e 47 20 28 74 31 2e 69 70   t2 USING (t1.ip
2c490 6b 3d 74 32 2e 69 70 6b 29 0a 20 20 2a 2a 20 20  k=t2.ipk).  **  
2c4a0 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2c4b0 33 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d  3 USING (t1.ipk=
2c4c0 74 33 2e 69 70 6b 29 0a 20 20 2a 2a 0a 20 20 2a  t3.ipk).  **.  *
2c4d0 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20 20 2a 2a 0a  * or from:.  **.
2c4e0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2c4f0 44 49 53 54 49 4e 43 54 20 76 31 2c 20 76 33 20  DISTINCT v1, v3 
2c500 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20  FROM t1 .  **   
2c510 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32      LEFT JOIN t2
2c520 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2c530 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28   JOIN t3 USING (
2c540 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20  t1.ipk=t3.ipk). 
2c550 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
2c560 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2c570 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
2c580 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
2c590 75 6c 74 53 65 74 21 3d 30 20 20 20 20 20 20 20  ultSet!=0       
2c5a0 20 20 20 20 20 20 20 20 2f 2a 20 67 75 61 72 61          /* guara
2c5b0 6e 74 65 65 73 20 63 6f 6e 64 69 74 69 6f 6e 20  ntees condition 
2c5c0 28 31 29 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  (1) above */.   
2c5d0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2c5e0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2c5f0 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
2c600 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
2c610 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
2c620 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65  sed = sqlite3Whe
2c630 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
2c640 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
2c650 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
2c660 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  WLB.pOrderBy ){.
2c670 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d        tabUsed |=
2c680 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2c690 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
2c6a0 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72  Set, sWLB.pOrder
2c6b0 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  By);.    }.    f
2c6c0 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
2c6d0 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d  vel-1; i>=1; i--
2c6e0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
2c6f0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
2c700 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
2c710 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2c720 65 6d 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20  em;.      pLoop 
2c730 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2c740 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 70 49 74  WLoop;.      pIt
2c750 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
2c760 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2c770 3e 69 54 61 62 5d 3b 0a 20 20 20 20 20 20 69 66  >iTab];.      if
2c780 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  ( (pItem->fg.joi
2c790 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2c7a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2c7b0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2c7c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2c7d0 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
2c7e0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2c7f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2c800 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
2c810 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
2c820 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2c830 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
2c840 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
2c850 53 65 6c 66 29 21 3d 30 20 29 20 63 6f 6e 74 69  Self)!=0 ) conti
2c860 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  nue;.      pEnd 
2c870 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
2c880 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
2c890 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
2c8a0 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
2c8b0 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
2c8c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2c8d0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2c8e0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2c8f0 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  elf)!=0 ){.     
2c900 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
2c910 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2c920 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2c930 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  oin).           
2c940 7c 7c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  || pTerm->pExpr-
2c950 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2c960 21 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  !=pItem->iCursor
2c970 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
2c980 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c990 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2c9b0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
2c9c0 45 6e 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  End ) continue;.
2c9d0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
2c9e0 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72  (0xffff, ("-> dr
2c9f0 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75  op loop %c not u
2ca00 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63  sed\n", pLoop->c
2ca10 49 64 29 29 3b 0a 20 20 20 20 20 20 6e 6f 74 52  Id));.      notR
2ca20 65 61 64 79 20 26 3d 20 7e 70 4c 6f 6f 70 2d 3e  eady &= ~pLoop->
2ca30 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2ca40 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2ca50 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2ca60 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2ca70 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2ca80 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2ca90 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
2cab0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2cac0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
2cad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2cae0 20 20 20 20 69 66 28 20 69 21 3d 70 57 49 6e 66      if( i!=pWInf
2caf0 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  o->nLevel-1 ){. 
2cb00 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
2cb10 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   = (pWInfo->nLev
2cb20 65 6c 2d 31 2d 69 29 20 2a 20 73 69 7a 65 6f 66  el-1-i) * sizeof
2cb30 28 57 68 65 72 65 4c 65 76 65 6c 29 3b 0a 20 20  (WhereLevel);.  
2cb40 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70        memmove(&p
2cb50 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c 20 26 70 57  WInfo->a[i], &pW
2cb60 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d 2c 20 6e 42  Info->a[i+1], nB
2cb70 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
2cb80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76      pWInfo->nLev
2cb90 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62  el--;.      nTab
2cba0 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  List--;.    }.  
2cbb0 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
2cbc0 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
2cbd0 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
2cbe0 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
2cbf0 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
2cc00 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
2cc10 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
2cc20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
2cc30 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
2cc40 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
2cc50 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
2cc60 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
2cc70 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
2cc80 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
2cc90 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
2cca0 69 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iate..  **.  ** 
2ccb0 41 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  A one-pass appro
2ccc0 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 20  ach can be used 
2ccd0 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  if the caller ha
2cce0 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 65 0a  s requested one.
2ccf0 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
2cd00 28 61 29 20 74 68 65 20 73 63 61 6e 20 76 69 73  (a) the scan vis
2cd10 69 74 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  its at most one 
2cd20 72 6f 77 20 6f 72 20 28 62 29 20 65 61 63 68 0a  row or (b) each.
2cd30 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c    ** of the foll
2cd40 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2cd50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 74 68    **.  **   * th
2cd60 65 20 63 61 6c 6c 65 72 20 68 61 73 20 69 6e 64  e caller has ind
2cd70 69 63 61 74 65 64 20 74 68 61 74 20 61 20 6f 6e  icated that a on
2cd80 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  e-pass approach 
2cd90 63 61 6e 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  can be used.  **
2cda0 20 20 20 20 20 77 69 74 68 20 6d 75 6c 74 69 70       with multip
2cdb0 6c 65 20 72 6f 77 73 20 28 62 79 20 73 65 74 74  le rows (by sett
2cdc0 69 6e 67 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  ing WHERE_ONEPAS
2cdd0 53 5f 4d 55 4c 54 49 52 4f 57 29 2c 20 61 6e 64  S_MULTIROW), and
2cde0 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 74 61  .  **   * the ta
2cdf0 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 72  ble is not a vir
2ce00 74 75 61 6c 20 74 61 62 6c 65 2c 20 61 6e 64 0a  tual table, and.
2ce10 20 20 2a 2a 20 20 20 2a 20 65 69 74 68 65 72 20    **   * either 
2ce20 74 68 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  the scan does no
2ce30 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70 74  t use the OR opt
2ce40 69 6d 69 7a 61 74 69 6f 6e 20 6f 72 20 74 68 65  imization or the
2ce50 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 20 20 20   caller.  **    
2ce60 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65   is a DELETE ope
2ce70 72 61 74 69 6f 6e 20 28 57 48 45 52 45 5f 44 55  ration (WHERE_DU
2ce80 50 4c 49 43 41 54 45 53 5f 4f 4b 20 69 73 20 6f  PLICATES_OK is o
2ce90 6e 6c 79 20 73 70 65 63 69 66 69 65 64 0a 20 20  nly specified.  
2cea0 2a 2a 20 20 20 20 20 66 6f 72 20 44 45 4c 45 54  **     for DELET
2ceb0 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  E)..  **.  ** Th
2cec0 65 20 6c 61 73 74 20 71 75 61 6c 69 66 69 63 61  e last qualifica
2ced0 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
2cee0 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
2cef0 65 6e 74 20 75 73 65 73 0a 20 20 2a 2a 20 57 68  ent uses.  ** Wh
2cf00 65 72 65 49 6e 66 6f 2e 61 69 43 75 72 4f 6e 65  ereInfo.aiCurOne
2cf10 50 61 73 73 5b 31 5d 20 74 6f 20 64 65 74 65 72  Pass[1] to deter
2cf20 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2cf30 6e 6f 74 20 69 74 20 72 65 61 6c 6c 79 20 63 61  not it really ca
2cf40 6e 0a 20 20 2a 2a 20 75 73 65 20 61 20 6f 6e 65  n.  ** use a one
2cf50 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 2c 20  -pass approach, 
2cf60 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  and this is not 
2cf70 73 65 74 20 61 63 63 75 72 61 74 65 6c 79 20 66  set accurately f
2cf80 6f 72 20 73 63 61 6e 73 0a 20 20 2a 2a 20 74 68  or scans.  ** th
2cf90 61 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70  at use the OR op
2cfa0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  timization..  */
2cfb0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2cfc0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2cfd0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2cfe0 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
2cff0 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
2d000 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2d010 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2d020 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  IRED)!=0 ){.    
2d030 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57  int wsFlags = pW
2d040 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
2d050 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2d060 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77  int bOnerow = (w
2d070 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2d080 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69  NEROW)!=0;.    i
2d090 66 28 20 62 4f 6e 65 72 6f 77 20 7c 7c 20 28 0a  f( bOnerow || (.
2d0a0 20 20 20 20 20 20 20 20 30 21 3d 28 77 63 74 72          0!=(wctr
2d0b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2d0c0 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2d0d0 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46  .     && 0==(wsF
2d0e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2d0f0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2d100 26 26 20 28 30 3d 3d 28 77 73 46 6c 61 67 73 20  && (0==(wsFlags 
2d110 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2d120 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
2d130 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
2d140 54 45 53 5f 4f 4b 29 29 0a 20 20 20 20 29 29 7b  TES_OK)).    )){
2d150 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2d160 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
2d170 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
2d180 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
2d190 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
2d1a0 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
2d1b0 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
2d1c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d1d0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
2d1e0 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
2d1f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2d200 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
2d210 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
2d220 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
2d230 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
2d240 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
2d250 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
2d260 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
2d270 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
2d280 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
2d290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
2d2a0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
2d2b0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
2d2c0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
2d2d0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
2d2e0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
2d2f0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2d300 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
2d310 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
2d320 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
2d330 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
2d340 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
2d350 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
2d360 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
2d370 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d380 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2d390 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
2d3a0 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
2d3b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2d3c0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
2d3d0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2d3e0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2d3f0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
2d400 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2d410 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
2d420 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2d430 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2d440 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
2d450 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
2d460 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2d470 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2d480 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
2d490 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
2d4a0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
2d4b0 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
2d4c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d4d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d4e0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
2d4f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d500 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2d510 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2d520 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2d530 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2d540 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2d550 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2d560 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2d570 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2d580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d590 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2d5a0 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2d5b0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2d5c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
2d5d0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
2d5e0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
2d5f0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
2d600 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
2d610 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2d620 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2d630 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
2d640 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d650 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2d660 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2d670 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
2d680 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2d690 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
2d6a0 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
2d6b0 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2d6c0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2d6d0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2d6e0 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
2d6f0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2d700 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
2d710 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2d720 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2d730 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2d740 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
2d750 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
2d760 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
2d770 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
2d780 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2d790 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2d7a0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2d7b0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
2d7c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d7d0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2d7e0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2d7f0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2d800 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2d810 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2d820 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2d830 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
2d840 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
2d850 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2d860 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2d870 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2d880 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2d890 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2d8a0 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2d8b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d8c0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
2d8d0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2d8e0 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
2d8f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d900 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
2d910 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
2d920 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2d930 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
2d940 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
2d950 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
2d960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d970 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2d980 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62   OPFLAG_SEEKEQ|b
2d990 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2d9a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2d9b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
2d9c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2d9d0 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65  P5(v, bFordelete
2d9e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2d9f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2da00 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2da10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2da20 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2da30 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2da40 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2da50 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da70 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29       (const u8*)
2da80 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  &pTabItem->colUs
2da90 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  ed, P4_INT64);.#
2daa0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2dab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
2dac0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2dad0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2dae0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2daf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2db00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2db10 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2db20 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2db30 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
2db40 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
2db50 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
2db60 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2db70 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2db80 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73     /* iAuxArg is
2db90 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 61   always set to a
2dba0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
2dbb0 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
2dbc0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
2dbd0 61 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21  assert( iAuxArg!
2dbe0 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
2dbf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2dc00 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2dc10 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
2dc20 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2dc30 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
2dc40 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
2dc50 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2dc60 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2dc70 42 43 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20  BCLAUSE)!=0.    
2dc80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2dc90 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d  This is one term
2dca0 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69   of an OR-optimi
2dcb0 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  zation using the
2dcc0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
2dcd0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54  a.        ** WIT
2dce0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2dcf0 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61  .  No need for a
2dd00 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20   separate index 
2dd10 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  */.        iInde
2dd20 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
2dd30 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20  TabCur;.        
2dd40 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  op = 0;.      }e
2dd50 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  lse if( pWInfo->
2dd60 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
2dd70 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
2dd80 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
2dd90 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
2dda0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
2ddb0 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
2ddc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ddd0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2dde0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2ddf0 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
2de00 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
2de10 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
2de20 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
2de30 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
2de40 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
2de50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2de60 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2de70 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2de80 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2de90 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
2dea0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
2deb0 66 28 20 69 41 75 78 41 72 67 20 26 26 20 28 77  f( iAuxArg && (w
2dec0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ded0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
2dee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  =0 ){.        iI
2def0 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72  ndexCur = iAuxAr
2df00 67 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  g;.        op = 
2df10 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20  OP_ReopenIdx;.  
2df20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2df30 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
2df40 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2df50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
2df60 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
2df70 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2df80 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
2df90 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
2dfa0 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
2dfb0 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d  ert( iIndexCur>=
2dfc0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 );.      if( o
2dfd0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
2dfe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2dff0 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c  , op, iIndexCur,
2e000 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29   pIx->tnum, iDb)
2e010 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e020 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
2e030 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
2e040 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f          if( (pLo
2e050 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2e060 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
2e070 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2e080 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2e090 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
2e0a0 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53  ANGE|WHERE_SKIPS
2e0b0 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20  CAN))==0.       
2e0c0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2e0d0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
2e0e0 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20  RDERBY_MIN)==0. 
2e0f0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
2e100 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57 48  o->eDistinct!=WH
2e110 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
2e120 45 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b 0a  ERED.        ){.
2e130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e140 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2e150 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b   OPFLAG_SEEKEQ);
2e160 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44   /* Hint to COMD
2e170 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  B2 */.        }.
2e180 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2e190 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2e1a0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64  x->zName));.#ifd
2e1b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2e1c0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2e1d0 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  K.        {.    
2e1e0 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65        u64 colUse
2e1f0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
2e200 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20   int ii, jj;.   
2e210 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
2e220 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e   ii<pIx->nColumn
2e230 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2e240 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61       jj = pIx->a
2e250 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20  iColumn[ii];.   
2e260 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c           if( jj<
2e270 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e280 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
2e290 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20  >63 ) jj = 63;. 
2e2a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2e2b0 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2e2c0 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29  d & MASKBIT(jj))
2e2d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
2e2f0 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c  sed |= ((u64)1)<
2e300 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36  <(ii<63 ? ii : 6
2e310 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
2e320 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e330 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
2e340 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
2e350 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c  d, iIndexCur, 0,
2e360 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65      (u8*)&colUse
2e390 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  d, P4_INT64);.  
2e3a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
2e3b0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
2e3c0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2e3d0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2e3e0 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  }.    if( iDb>=0
2e3f0 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
2e400 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2e410 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
2e420 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
2e430 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2e440 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
2e450 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2e460 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2e470 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
2e480 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
2e490 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
2e4a0 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
2e4b0 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
2e4c0 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
2e4d0 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
2e4e0 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
2e4f0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
2e500 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
2e510 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
2e520 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
2e530 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78  {.    int addrEx
2e540 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77  plain;.    int w
2e550 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  sFlags;.    pLev
2e560 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2e570 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73  ii];.    wsFlags
2e580 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2e590 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e  p->wsFlags;.#ifn
2e5a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e5b0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
2e5c0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2e5d0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
2e5e0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
2e5f0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2e600 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2e610 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2e620 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20   &pWInfo->sWC,. 
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2e640 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2e650 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52  el->iFrom], notR
2e660 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
2e670 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2e680 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2e690 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2e6a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2e6b0 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d     addrExplain =
2e6c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2e6d0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
2e6e0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
2e6f0 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 77  bList, pLevel, w
2e700 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b  ctrlFlags.    );
2e710 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2e720 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  rBody = sqlite3V
2e730 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2e740 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2e750 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  = sqlite3WhereCo
2e760 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2e770 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
2e780 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
2e790 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
2e7a0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
2e7b0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
2e7c0 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
2e7d0 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61  ==0 && (wctrlFla
2e7e0 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  gs&WHERE_OR_SUBC
2e7f0 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2e800 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41     sqlite3WhereA
2e810 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
2e820 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
2e830 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
2e840 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2e850 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
2e860 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2e870 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
2e880 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
2e890 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
2e8a0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
2e8b0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
2e8c0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
2e8d0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
2e8e0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2e8f0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
2e900 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
2e910 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2e920 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2e930 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e940 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f 66 20 73 71  /*.** Part of sq
2e950 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2e960 77 69 6c 6c 20 72 65 77 72 69 74 65 20 6f 70 63  will rewrite opc
2e970 6f 64 65 73 20 74 6f 20 72 65 66 65 72 65 6e 63  odes to referenc
2e980 65 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 72  e the.** index r
2e990 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
2e9a0 61 69 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 53  ain table.  In S
2e9b0 51 4c 49 54 45 5f 44 45 42 55 47 20 6d 6f 64 65  QLITE_DEBUG mode
2e9c0 2c 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20  , we want.** to 
2e9d0 74 72 61 63 65 20 74 68 6f 73 65 20 63 68 61 6e  trace those chan
2e9e0 67 65 73 20 69 66 20 50 52 41 47 4d 41 20 76 64  ges if PRAGMA vd
2e9f0 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e  be_addoptrace=on
2ea00 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
2ea10 2a 2a 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f  ** does that..*/
2ea20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ea30 44 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 4f  DEBUG.# define O
2ea40 70 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63  pcodeRewriteTrac
2ea50 65 28 44 2c 4b 2c 50 29 20 2f 2a 20 6e 6f 2d 6f  e(D,K,P) /* no-o
2ea60 70 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66  p */.#else.# def
2ea70 69 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74  ine OpcodeRewrit
2ea80 65 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 73 71  eTrace(D,K,P) sq
2ea90 6c 69 74 65 33 57 68 65 72 65 4f 70 63 6f 64 65  lite3WhereOpcode
2eaa0 52 65 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b  RewriteTrace(D,K
2eab0 2c 50 29 0a 20 20 73 74 61 74 69 63 20 76 6f 69  ,P).  static voi
2eac0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70  d sqlite3WhereOp
2ead0 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
2eae0 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  (.    sqlite3 *d
2eaf0 62 2c 0a 20 20 20 20 69 6e 74 20 70 63 2c 0a 20  b,.    int pc,. 
2eb00 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 0a 20     VdbeOp *pOp. 
2eb10 20 29 7b 0a 20 20 20 20 69 66 28 20 28 64 62 2d   ){.    if( (db-
2eb20 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2eb30 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 29 3d  VdbeAddopTrace)=
2eb40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
2eb50 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
2eb60 74 4f 70 28 30 2c 20 70 63 2c 20 70 4f 70 29 3b  tOp(0, pc, pOp);
2eb70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  .  }.#endif../*.
2eb80 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
2eb90 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2eba0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
2ebb0 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
2ebc0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2ebd0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2ebe0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
2ebf0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
2ec00 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
2ec10 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
2ec20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
2ec30 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
2ec40 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2ec50 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2ec60 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2ec70 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
2ec80 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
2ec90 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
2eca0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2ecb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2ecc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
2ecd0 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
2ece0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
2ecf0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ..  */.  VdbeMod
2ed00 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
2ed10 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29  End WHERE-core")
2ed20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
2ed30 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2ed40 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2ed50 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65   addr;.    pLeve
2ed60 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2ed70 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
2ed80 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
2ed90 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2eda0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69  p!=OP_Noop ){.#i
2edb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2edc0 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2edd0 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e  ISTINCT.      in
2ede0 74 20 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a  t addrSeek = 0;.
2edf0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
2ee00 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  x;.      int n;.
2ee10 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2ee20 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
2ee30 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2ee40 52 45 44 0a 20 20 20 20 20 20 20 26 26 20 69 3d  RED.       && i=
2ee50 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2ee60 31 20 20 2f 2a 20 54 69 63 6b 65 74 20 5b 65 66  1  /* Ticket [ef
2ee70 39 33 31 38 37 35 37 62 31 35 32 65 33 5d 20 32  9318757b152e3] 2
2ee80 30 31 37 2d 31 30 2d 32 31 20 2a 2f 0a 20 20 20  017-10-21 */.   
2ee90 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
2eea0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2eeb0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
2eec0 20 20 26 26 20 28 70 49 64 78 20 3d 20 70 4c 6f    && (pIdx = pLo
2eed0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2eee0 65 78 29 2d 3e 68 61 73 53 74 61 74 31 0a 20 20  ex)->hasStat1.  
2eef0 20 20 20 20 20 26 26 20 28 6e 20 3d 20 70 4c 6f       && (n = pLo
2ef00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78  op->u.btree.nIdx
2ef10 43 6f 6c 29 3e 30 0a 20 20 20 20 20 20 20 26 26  Col)>0.       &&
2ef20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
2ef30 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20 20 20 20 20  st[n]>=36.      
2ef40 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
2ef50 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
2ef60 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +1;.        int 
2ef70 6a 2c 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 66  j, op;.        f
2ef80 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2ef90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2efa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2efb0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4c 65  , OP_Column, pLe
2efc0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6a 2c  vel->iIdxCur, j,
2efd0 20 72 31 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20   r1+j);.        
2efe0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
2eff0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a 20  ->nMem += n+1;. 
2f000 20 20 20 20 20 20 20 6f 70 20 3d 20 70 4c 65 76         op = pLev
2f010 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 20  el->op==OP_Prev 
2f020 3f 20 4f 50 5f 53 65 65 6b 4c 54 20 3a 20 4f 50  ? OP_SeekLT : OP
2f030 5f 53 65 65 6b 47 54 3b 0a 20 20 20 20 20 20 20  _SeekGT;.       
2f040 20 61 64 64 72 53 65 65 6b 20 3d 20 73 71 6c 69   addrSeek = sqli
2f050 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2f060 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  (v, op, pLevel->
2f070 69 49 64 78 43 75 72 2c 20 30 2c 20 72 31 2c 20  iIdxCur, 0, r1, 
2f080 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  n);.        Vdbe
2f090 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
2f0a0 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20  ==OP_SeekLT);.  
2f0b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2f0c0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
2f0d0 65 65 6b 47 54 29 3b 0a 20 20 20 20 20 20 20 20  eekGT);.        
2f0e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f0f0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c  2(v, OP_Goto, 1,
2f100 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
2f110 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
2f120 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53  SQLITE_DISABLE_S
2f130 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43  KIPAHEAD_DISTINC
2f140 54 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  T */.      /* Th
2f150 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41  e common case: A
2f160 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
2f170 78 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  xt row */.      
2f180 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2f190 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2f1a0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
2f1b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f1c0 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp3(v, pLevel-
2f1d0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
2f1e0 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65   pLevel->p2, pLe
2f1f0 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  vel->p3);.      
2f200 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f210 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
2f220 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  5);.      VdbeCo
2f230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2f240 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2f250 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2f260 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56  P_Next);.      V
2f270 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2f280 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2f290 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62  Prev);.      Vdb
2f2a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2f2b0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e  Level->op==OP_VN
2f2c0 65 78 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ext);.#ifndef SQ
2f2d0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49  LITE_DISABLE_SKI
2f2e0 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a  PAHEAD_DISTINCT.
2f2f0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 53 65        if( addrSe
2f300 65 6b 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ek ) sqlite3Vdbe
2f310 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2f320 53 65 65 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Seek);.#endif.  
2f330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2f340 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2f350 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2f360 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
2f370 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2f380 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f390 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
2f3a0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
2f3b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2f3c0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
2f3d0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2f3e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2f3f0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2f400 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
2f410 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
2f420 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
2f430 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
2f440 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
2f450 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
2f460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f470 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2f480 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
2f490 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e         if( pIn->
2f4a0 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e  eEndLoopOp!=OP_N
2f4b0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oop ){.         
2f4c0 20 69 66 28 20 70 49 6e 2d 3e 6e 50 72 65 66 69   if( pIn->nPrefi
2f4d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x ){.           
2f4e0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
2f4f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f500 49 4e 5f 45 41 52 4c 59 4f 55 54 20 29 3b 0a 20  IN_EARLYOUT );. 
2f510 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f520 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2f530 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f 70 65 2c 20  v, OP_IfNoHope, 
2f540 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
2f550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2f570 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f580 74 41 64 64 72 28 76 29 2b 32 2c 0a 20 20 20 20  tAddr(v)+2,.    
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5a0 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
2f5b0 42 61 73 65 2c 20 70 49 6e 2d 3e 6e 50 72 65 66  Base, pIn->nPref
2f5c0 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ix);.           
2f5d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f5f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f600 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
2f610 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
2f620 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
2f630 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
2f640 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2f650 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  (v);.          V
2f660 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2f670 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2f680 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2f690 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2f6a0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
2f6b0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
2f6c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f6d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f6e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2f6f0 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
2f700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f710 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2f720 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2f730 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
2f740 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
2f750 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
2f760 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
2f770 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2f780 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  kip);.      Vdbe
2f790 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
2f7a0 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  t skip-scan on %
2f7b0 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  s", pLoop->u.btr
2f7c0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
2f7d0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f7e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2f7f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2f800 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
2f810 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2f820 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2f830 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  p-2);.    }.#ifn
2f840 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
2f850 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
2f860 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  BS.    if( pLeve
2f870 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29  l->addrLikeRep )
2f880 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2f890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f8a0 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69  DecrJumpZero, (i
2f8b0 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
2f8c0 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20  eRepCntr>>1),.  
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8e0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
2f8f0 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20  drLikeRep);.    
2f900 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2f910 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2f920 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2f930 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
2f940 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
2f950 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2f960 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2f970 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f980 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2f990 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
2f9a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2f9b0 20 20 20 61 73 73 65 72 74 28 20 28 77 73 20 26     assert( (ws &
2f9c0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2f9d0 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45  ==0 || (ws & WHE
2f9e0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2f9f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  ;.      if( (ws 
2fa00 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2fa10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2fa20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
2fa30 69 54 61 62 43 75 72 3d 3d 70 54 61 62 4c 69 73  iTabCur==pTabLis
2fa40 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2fa50 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20  om].iCursor );. 
2fa60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2fa70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2fa80 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2fa90 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20  iTabCur);.      
2faa0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
2fab0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2fac0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73   .       || ((ws
2fad0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
2fae0 52 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  R) && pLevel->u.
2faf0 70 43 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20  pCovidx) .      
2fb00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2fb10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2fb20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
2fb30 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
2fb40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fb50 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
2fb60 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
2fb70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb80 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2fb90 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2fba0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
2fbb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fbc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fbd0 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
2fbe0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2fbf0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2fc00 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2fc10 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
2fc20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2fc30 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
2fc40 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
2fc50 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
2fc60 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2fc70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2fc80 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
2fc90 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
2fca0 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
2fcb0 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
2fcc0 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
2fcd0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
2fce0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
2fcf0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2fd00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2fd10 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
2fd20 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
2fd30 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
2fd40 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2fd50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
2fd60 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
2fd70 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
2fd80 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2fd90 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
2fda0 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
2fdb0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
2fdc0 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
2fdd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2fde0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2fdf0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2fe00 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
2fe10 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
2fe20 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
2fe30 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2fe40 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2fe50 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
2fe60 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
2fe70 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
2fe80 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
2fe90 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
2fea0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2feb0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
2fec0 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
2fed0 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
2fee0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
2fef0 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
2ff00 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
2ff10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
2ff20 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
2ff30 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
2ff40 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
2ff50 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2ff60 65 64 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e  ed );.      tran
2ff70 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70  slateColumnToCop
2ff80 79 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  y(pParse, pLevel
2ff90 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76  ->addrBody, pLev
2ffa0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20  el->iTabCur,.   
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffc0 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
2ffd0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29  m->regResult, 0)
2ffe0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2fff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30000 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
30010 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
30020 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
30030 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
30040 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
30050 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
30060 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
30070 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
30080 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
30090 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
300a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
300b0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
300c0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
300d0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
300e0 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
300f0 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
30100 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
30110 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
30120 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
30130 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
30140 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
30150 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
30160 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
30170 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
30180 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
30190 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
301a0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
301b0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
301c0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
301d0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
301e0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
301f0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
30200 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
30210 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
30220 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
30230 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
30240 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
30250 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
30260 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
30270 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
30280 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
30290 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
302a0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
302b0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
302c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
302d0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
302e0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
302f0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
30300 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
30310 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
30320 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
30330 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
30340 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
30350 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
30360 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
30370 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
30380 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30390 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
303a0 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
303b0 64 64 72 42 6f 64 79 3b 0a 23 69 66 64 65 66 20  ddrBody;.#ifdef 
303c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
303d0 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
303e0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
303f0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
30400 20 20 20 20 70 72 69 6e 74 66 28 22 54 52 41 4e      printf("TRAN
30410 53 4c 41 54 45 20 6f 70 63 6f 64 65 73 20 69 6e  SLATE opcodes in
30420 20 72 61 6e 67 65 20 25 64 2e 2e 25 64 5c 6e 22   range %d..%d\n"
30430 2c 20 6b 2c 20 6c 61 73 74 2d 31 29 3b 0a 20 20  , k, last-1);.  
30440 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30450 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
30460 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
30470 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
30480 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
30490 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
304a0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
304b0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
304c0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
304d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
304e0 6f 6c 75 6d 6e 0a 23 69 66 64 65 66 20 53 51 4c  olumn.#ifdef SQL
304f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
30500 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
30510 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f      || pOp->opco
30520 64 65 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a 23 65  de==OP_Offset.#e
30530 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a  ndif.        ){.
30540 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
30550 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
30560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
30570 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20  x->pTable==pTab 
30580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30590 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
305a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
305b0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
305c0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
305d0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
305e0 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
305f0 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20  aiColumn[x];.   
30600 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30610 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
30620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78     }.          x
30630 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
30640 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29  OfIndex(pIdx, x)
30650 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30660 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x>=0 ){.        
30670 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b      pOp->p2 = x;
30680 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
30690 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
306a0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
306b0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
306c0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
306d0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
306e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
306f0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
30700 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
30710 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a  LY)==0 || x>=0 .
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
30730 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
30740 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  s );.        }el
30750 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
30760 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
30770 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
30780 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
30790 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
307a0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
307b0 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
307c0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
307d0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
307e0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
307f0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
30800 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  e==OP_IfNullRow 
30810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
30820 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
30830 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
30840 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54    OpcodeRewriteT
30850 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f 70 29  race(db, k, pOp)
30860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30870 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
30880 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
30890 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
308a0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
308b0 61 63 65 20 29 20 70 72 69 6e 74 66 28 22 54 52  ace ) printf("TR
308c0 41 4e 53 4c 41 54 45 20 63 6f 6d 70 6c 65 74 65  ANSLATE complete
308d0 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  \n");.#endif.   
308e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
308f0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
30900 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
30910 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
30920 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
30930 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
30940 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
30950 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.