/ Hex Artifact Content
Login

Artifact 6cc2708ab9a386c0aef3fa50ed0f5bdfed22848e492960a4504eb25bdb79c8d1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 49 6e 20 74 68 65 20 4f 52 44 45 52 20  ** In the ORDER 
08e0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
08f0: 61 74 69 6f 6e 2c 20 69 66 20 74 68 65 20 69 6e  ation, if the in
0900: 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 73  ner-most loop is
0910: 20 6b 6e 6f 77 6e 0a 2a 2a 20 74 6f 20 65 6d 69   known.** to emi
0920: 74 20 72 6f 77 73 20 69 6e 20 69 6e 63 72 65 61  t rows in increa
0930: 73 69 6e 67 20 6f 72 64 65 72 2c 20 61 6e 64 20  sing order, and 
0940: 69 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  if the last row 
0950: 65 6d 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a  emitted by the.*
0960: 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  * inner-most loo
0970: 70 20 64 69 64 20 6e 6f 74 20 66 69 74 20 77 69  p did not fit wi
0980: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  thin the sorter,
0990: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 73 6b 69   then we can ski
09a0: 70 20 61 6c 6c 0a 2a 2a 20 73 75 62 73 65 71 75  p all.** subsequ
09b0: 65 6e 74 20 72 6f 77 73 20 66 6f 72 20 74 68 65  ent rows for the
09c0: 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69   current iterati
09d0: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  on of the inner 
09e0: 6c 6f 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  loop (because th
09f0: 65 79 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  ey.** will not f
0a00: 69 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  it in the sorter
0a10: 20 65 69 74 68 65 72 29 20 61 6e 64 20 63 6f 6e   either) and con
0a20: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 73  tinue with the s
0a30: 65 63 6f 6e 64 20 69 6e 6e 65 72 0a 2a 2a 20 6c  econd inner.** l
0a40: 6f 6f 70 20 2d 20 74 68 65 20 6c 6f 6f 70 20 69  oop - the loop i
0a50: 6d 6d 65 64 69 61 74 65 6c 79 20 6f 75 74 73 69  mmediately outsi
0a60: 64 65 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  de the inner-mos
0a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  t..**.** When a 
0a80: 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  row does not fit
0a90: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 28   in the sorter (
0aa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 6f 72 74  because the sort
0ab0: 65 72 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  er already.** ho
0ac0: 6c 64 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  lds LIMIT+OFFSET
0ad0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 73   rows that are s
0ae0: 6d 61 6c 6c 65 72 29 2c 20 74 68 65 6e 20 61 20  maller), then a 
0af0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
0b00: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 72 65 74  the.** label ret
0b10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
0b20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
0b30: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
0b40: 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  MIT optimization
0b50: 20 61 70 70 6c 69 65 73 2c 20 74 68 65 20 6a 75   applies, the ju
0b60: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73  mp destination s
0b70: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20  hould.** be the 
0b80: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72  continuation for
0b90: 20 74 68 65 20 73 65 63 6f 6e 64 2d 69 6e 6e 65   the second-inne
0ba0: 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20 20 49 66  r-most loop.  If
0bb0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
0bc0: 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74   LIMIT optimizat
0bd0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ion does not app
0be0: 6c 79 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ly, then the jum
0bf0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 68  p destination sh
0c00: 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20 63  ould.** be the c
0c10: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72 20  ontinuation for 
0c20: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
0c30: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  oop..**.** It is
0c40: 20 61 6c 77 61 79 73 20 73 61 66 65 20 66 6f 72   always safe for
0c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
0c60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74   return the cont
0c70: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  inuation of the.
0c80: 2a 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  ** inner-most lo
0c90: 6f 70 2c 20 69 6e 20 74 68 65 20 73 65 6e 73 65  op, in the sense
0ca0: 20 74 68 61 74 20 61 20 63 6f 72 72 65 63 74 20   that a correct 
0cb0: 61 6e 73 77 65 72 20 77 69 6c 6c 20 72 65 73 75  answer will resu
0cc0: 6c 74 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 69  lt.  .** Returni
0cd0: 6e 67 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ng the continuat
0ce0: 69 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ion the second i
0cf0: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 61 6e 20  nner loop is an 
0d00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0d10: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 6b 65 20  that might make 
0d20: 74 68 65 20 63 6f 64 65 20 72 75 6e 20 61 20 6c  the code run a l
0d30: 69 74 74 6c 65 20 66 61 73 74 65 72 2c 20 62 75  ittle faster, bu
0d40: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  t should not cha
0d50: 6e 67 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  nge.** the final
0d60: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
0d70: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
0d80: 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c  rByLimitOptLabel
0d90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0da0: 66 6f 29 7b 0a 20 20 57 68 65 72 65 4c 65 76 65  fo){.  WhereLeve
0db0: 6c 20 2a 70 49 6e 6e 65 72 3b 0a 20 20 69 66 28  l *pInner;.  if(
0dc0: 20 21 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72   !pWInfo->bOrder
0dd0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
0de0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
0df0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
0e00: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
0e10: 70 70 6c 79 2e 20 20 4a 75 6d 70 20 74 6f 20 74  pply.  Jump to t
0e20: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 69  he .    ** conti
0e30: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  nuation of the i
0e40: 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20  nner-most loop. 
0e50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 57  */.    return pW
0e60: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
0e70: 0a 20 20 7d 0a 20 20 70 49 6e 6e 65 72 20 3d 20  .  }.  pInner = 
0e80: 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66  &pWInfo->a[pWInf
0e90: 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 3b 0a 20 20  o->nLevel-1];.  
0ea0: 61 73 73 65 72 74 28 20 70 49 6e 6e 65 72 2d 3e  assert( pInner->
0eb0: 61 64 64 72 4e 78 74 21 3d 30 20 29 3b 0a 20 20  addrNxt!=0 );.  
0ec0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ed0: 64 64 72 4e 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrNxt;.}../*.**
0ee0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0ef0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f00: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f10: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f20: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f30: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f40: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f50: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f60: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f70: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f80: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0f90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fa0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fb0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fc0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0fe0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
0ff0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1000: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1010: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1020: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1030: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1040: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1050: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1060: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1070: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1080: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
1090: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10b0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10c0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10d0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
10f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1100: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1110: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1140: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1150: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1160: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1170: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1180: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
1190: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11b0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11c0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11d0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11e0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
11f0: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1200: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1210: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1220: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1230: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1240: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1250: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1260: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1270: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1280: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
1290: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12a0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12b0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12c0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12d0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
12f0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1300: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1310: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1320: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1330: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1340: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1350: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1360: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1370: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1380: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
1390: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13a0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13d0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
13f0: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1400: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1410: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1420: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1430: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1440: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1450: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1460: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1470: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1480: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
1490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14a0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14c0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14d0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14e0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
14f0: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1500: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1510: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1520: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1530: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1540: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1560: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1570: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1580: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
1590: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15a0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15b0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15c0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15d0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15e0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
15f0: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1600: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1610: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1620: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1630: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1640: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1650: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1660: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1670: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1680: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
1690: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16a0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16b0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16c0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16d0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16e0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
16f0: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1700: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1710: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1720: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1730: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1740: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1750: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1760: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1770: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1780: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
1790: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17a0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17b0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17c0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17d0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17e0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
17f0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1810: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1820: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1830: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1840: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1850: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1860: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1870: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1880: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
1890: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18a0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18b0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18c0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18d0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18e0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
18f0: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1900: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1910: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1930: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1940: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1950: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1960: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1970: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1990: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19a0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19d0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19e0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
19f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a00: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a10: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a20: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a30: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a40: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a50: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a60: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a70: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1a90: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1aa0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ab0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ac0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ad0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1ae0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1af0: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b00: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b30: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b40: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b50: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b60: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b70: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1b90: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1ba0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bc0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1be0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1bf0: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c00: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c10: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c20: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c40: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c50: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c70: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c80: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1c90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1ca0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cb0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cc0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1cd0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1ce0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1cf0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d00: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d10: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d20: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d40: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d50: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d60: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d70: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d80: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1da0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1db0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dc0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1dd0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1de0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1df0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e00: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e10: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e20: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e30: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e40: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e50: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e70: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e80: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1e90: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ec0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ed0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ee0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1ef0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f00: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f10: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f20: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f40: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f50: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f60: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f70: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f80: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1f90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fa0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fb0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fc0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fd0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1fe0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
1ff0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2000: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2010: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2020: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2030: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2050: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2060: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2070: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2080: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
2090: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20a0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20b0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20c0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20d0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20e0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
20f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2110: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2120: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2130: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2140: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2150: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2170: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2180: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
2190: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21c0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21d0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21e0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
21f0: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2200: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2210: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2220: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2250: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2260: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2270: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2280: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
2290: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22a0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
22c0: 64 4c 69 6b 65 6c 79 28 70 54 65 72 6d 2d 3e 70  dLikely(pTerm->p
22d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
22e0: 6f 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  op.             
22f0: 20 20 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20    ==TK_COLUMN.  
2300: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2310: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
2320: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2330: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
2340: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
2350: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
2360: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
2370: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
2380: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
2390: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
23a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
23c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23f0: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
2400: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
2410: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
2420: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
2430: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
2440: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
2450: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
2460: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2470: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
2480: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2490: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24a0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
24b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
24c0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
24d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24e0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
24f0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
2500: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
2510: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2520: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
2530: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
2540: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2550: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
2570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
2590: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
25a0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
25b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
25c0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
25d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25e0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
25f0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
2600: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2620: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2640: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2650: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
2660: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2670: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2680: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2690: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
26d0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26f0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
2700: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2710: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2720: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2730: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
2740: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
2750: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
2760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2770: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2780: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27a0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
27b0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
27c0: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
27e0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
27f0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
2800: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
2810: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
2820: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
2830: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
2840: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
2850: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
2860: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
2870: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2880: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2890: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28a0: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
28b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28d0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
28e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20  ->pWC = pWC;.   
28f0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2900: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
2910: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
2920: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
2930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2940: 0a 20 20 20 20 20 20 70 57 43 20 3d 20 70 57 43  .      pWC = pWC
2950: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
2960: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2970: 65 28 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20  e( pWC!=0 );.   
2980: 20 69 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75   if( pScan->iEqu
2990: 69 76 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv>=pScan->nEqui
29a0: 76 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  v ) break;.    p
29b0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69  WC = pScan->pOri
29c0: 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a  gWC;.    k = 0;.
29d0: 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69      pScan->iEqui
29e0: 76 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  v++;.  }.  retur
29f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2a00: 69 73 20 69 73 20 77 68 65 72 65 53 63 61 6e 49  is is whereScanI
2a10: 6e 69 74 28 29 20 66 6f 72 20 74 68 65 20 63 61  nit() for the ca
2a20: 73 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 6f  se of an index o
2a30: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
2a40: 0a 2a 2a 20 49 74 20 69 73 20 66 61 63 74 6f 72  .** It is factor
2a50: 65 64 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  ed out into a se
2a60: 70 61 72 61 74 65 20 74 61 69 6c 2d 72 65 63 75  parate tail-recu
2a70: 72 73 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  rsion subroutine
2a80: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20   so that.** the 
2a90: 6e 6f 72 6d 61 6c 20 77 68 65 72 65 53 63 61 6e  normal whereScan
2aa0: 49 6e 69 74 28 29 20 72 6f 75 74 69 6e 65 2c 20  Init() routine, 
2ab0: 77 68 69 63 68 20 69 73 20 61 20 68 69 67 68 2d  which is a high-
2ac0: 72 75 6e 6e 65 72 2c 20 64 6f 65 73 20 6e 6f 74  runner, does not
2ad0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 70 75 73 68  .** need to push
2ae0: 20 72 65 67 69 73 74 65 72 73 20 6f 6e 74 6f 20   registers onto 
2af0: 74 68 65 20 73 74 61 63 6b 20 61 73 20 70 61 72  the stack as par
2b00: 74 20 6f 66 20 69 74 73 20 70 72 6f 6c 6f 67 75  t of its prologu
2b10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
2b20: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 57 68 65  ITE_NOINLINE Whe
2b30: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
2b40: 6e 49 6e 69 74 49 6e 64 65 78 45 78 70 72 28 57  nInitIndexExpr(W
2b50: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29  hereScan *pScan)
2b60: 7b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66  {.  pScan->idxaf
2b70: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2b80: 66 66 69 6e 69 74 79 28 70 53 63 61 6e 2d 3e 70  ffinity(pScan->p
2b90: 49 64 78 45 78 70 72 29 3b 0a 20 20 72 65 74 75  IdxExpr);.  retu
2ba0: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
2bb0: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
2bc0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2bd0: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
2be0: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
2bf0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2c00: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2c10: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
2c20: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
2c30: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
2c40: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
2c50: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
2c60: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c70: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2c80: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2ca0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2cb0: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2cc0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2cd0: 2a 20 69 43 75 72 2e 20 20 20 4f 72 20 69 66 20  * iCur.   Or if 
2ce0: 70 49 64 78 21 3d 30 20 74 68 65 6e 20 58 20 69  pIdx!=0 then X i
2cf0: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
2d00: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 20   of index pIdx. 
2d10: 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74 20 62 65   pIdx.** must be
2d20: 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
2d30: 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75  xes of table iCu
2d40: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6f 70  r..**.** The <op
2d50: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2d60: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2d70: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2d80: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
2d90: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
2da0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
2db0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
2dc0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
2dd0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
2de0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2df0: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2e00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2e10: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2e20: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2e30: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2e40: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2e50: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2e60: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2e70: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2e80: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
2e90: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
2ea0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
2eb0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2ec0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
2ed0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
2ee0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2ef0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2f00: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2f10: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2f20: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2f30: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2f40: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2f50: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2f60: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2f70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2f80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
2f90: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
2fa0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2fb0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2fc0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
2fd0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
2fe0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2ff0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
3000: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
3010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
3020: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
3030: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
3040: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
3050: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3060: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3070: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 70   index */.){.  p
3080: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
3090: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
30a0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
30b0: 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a  ->pIdxExpr = 0;.
30c0: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
30d0: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 7a 43  = 0;.  pScan->zC
30e0: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ollName = 0;.  p
30f0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
3100: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
3110: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
3120: 61 69 43 75 72 5b 30 5d 20 3d 20 69 43 75 72 3b  aiCur[0] = iCur;
3130: 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  .  pScan->nEquiv
3140: 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e 2d 3e 69   = 1;.  pScan->i
3150: 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 69 66 28  Equiv = 1;.  if(
3160: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
3170: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
3180: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
3190: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
31a0: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
31b0: 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20  XN_EXPR ){.     
31c0: 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72   pScan->pIdxExpr
31d0: 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70   = pIdx->aColExp
31e0: 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  r->a[j].pExpr;. 
31f0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c       pScan->zCol
3200: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
3210: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 70  Coll[j];.      p
3220: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  Scan->aiColumn[0
3230: 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
3240: 20 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53     return whereS
3250: 63 61 6e 49 6e 69 74 49 6e 64 65 78 45 78 70 72  canInitIndexExpr
3260: 28 70 53 63 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  (pScan);.    }el
3270: 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d  se if( iColumn==
3280: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  pIdx->pTable->iP
3290: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  Key ){.      iCo
32a0: 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
32b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
32c0: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
32d0: 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66     pScan->idxaff
32e0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
32f0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
3300: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 70  ffinity;.      p
3310: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3320: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
3330: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
3340: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
3350: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 72 65 74  _EXPR ){.    ret
3360: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  urn 0;.  }.  pSc
3370: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
3380: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 72 65 74  = iColumn;.  ret
3390: 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78  urn whereScanNex
33a0: 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pScan);.}../*.
33b0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  ** Search for a 
33c0: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
33d0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
33e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
33f0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
3400: 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66  where X is a ref
3410: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43  erence to the iC
3420: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
3430: 43 75 72 20 6f 72 20 6f 66 20 69 6e 64 65 78 20  Cur or of index 
3440: 70 49 64 78 0a 2a 2a 20 69 66 20 70 49 64 78 21  pIdx.** if pIdx!
3450: 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  =0 and <op> is o
3460: 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f 78 78 20  ne of the WO_xx 
3470: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
3480: 70 65 63 69 66 69 65 64 20 62 79 0a 2a 2a 20 74  pecified by.** t
3490: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
34a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
34b0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
34c0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
34d0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
34e0: 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20 69 74   pIdx!=0 then it
34f0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
3500: 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  the indexes of t
3510: 61 62 6c 65 20 69 43 75 72 2e 20 20 0a 2a 2a 20  able iCur.  .** 
3520: 53 65 61 72 63 68 20 66 6f 72 20 74 65 72 6d 73  Search for terms
3530: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 43   matching the iC
3540: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3550: 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61 74 68 65  of pIdx.** rathe
3560: 72 20 74 68 61 6e 20 74 68 65 20 69 43 6f 6c 75  r than the iColu
3570: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  mn-th column of 
3580: 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a  table iCur..**.*
3590: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
35a0: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
35b0: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
35c0: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
35d0: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
35e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
35f0: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
3600: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
3610: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
3620: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
3630: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
3640: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
3650: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
3660: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 69 43 75  ld.  The.** aiCu
3670: 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b 5d 20 61  r[]/iaColumn[] a
3680: 72 72 61 79 73 20 68 6f 6c 64 20 58 20 61 6e 64  rrays hold X and
3690: 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c   all its equival
36a0: 65 6e 74 73 2e 20 54 68 65 72 65 20 61 72 65 20  ents. There are 
36b0: 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69 6e 20 61  11.** slots in a
36c0: 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75 6d 6e 5b  iCur[]/aiColumn[
36d0: 5d 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  ] so that means 
36e0: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
36f0: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 0a  X plus up to 10.
3700: 2a 2a 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  ** other equival
3710: 65 6e 74 20 76 61 6c 75 65 73 2e 20 20 48 65 6e  ent values.  Hen
3720: 63 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  ce a search for 
3730: 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65  X will return <e
3740: 78 70 72 3e 20 69 66 20 58 3d 41 31 0a 2a 2a 20  xpr> if X=A1.** 
3750: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
3760: 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20  =A3 and ... and 
3770: 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c  A9=A10 and A10=<
3780: 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  expr>..**.** If 
3790: 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70  there are multip
37a0: 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
37b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
37c0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
37d0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e   <expr>".** then
37e0: 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65   try for the one
37f0: 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65   with no depende
3800: 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20  ncies on <expr> 
3810: 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  - in other words
3820: 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e   where.** <expr>
3830: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
3840: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d  xpression of som
3850: 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65  e kind.  Only re
3860: 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a  turn entries of.
3870: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
3880: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69  op> Y" where Y i
3890: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e  s a column in an
38a0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e  other table if n
38b0: 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68  o terms of.** th
38c0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
38d0: 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69  const-expr>" exi
38e0: 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d  st.   If no term
38f0: 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  s with a constan
3900: 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20  t RHS.** exist, 
3910: 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20  try to return a 
3920: 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e  term that does n
3930: 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e  ot use WO_EQUIV.
3940: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 73  .*/.WhereTerm *s
3950: 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
3960: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
3970: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
3980: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3990: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
39a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
39b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
39c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
39d0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
39e0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
39f0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3a00: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
3a10: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
3a20: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
3a30: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
3a40: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
3a50: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3a60: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
3a70: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
3a80: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
3a90: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
3aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
3ab0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
3ac0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
3ad0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
3ae0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
3af0: 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57  pResult = 0;.  W
3b00: 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57  hereTerm *p;.  W
3b10: 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a  hereScan scan;..
3b20: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49    p = whereScanI
3b30: 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20  nit(&scan, pWC, 
3b40: 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f  iCur, iColumn, o
3b50: 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f 70 20 26  p, pIdx);.  op &
3b60: 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 3b 0a 20  = WO_EQ|WO_IS;. 
3b70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
3b80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
3b90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3bb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
3bc0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
3bd0: 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b 0a 20 20  tor&op)!=0 ){.  
3be0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3bf0: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  p->eOperator & W
3c00: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
3c10: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20  return p;.      
3c20: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  }.      if( pRes
3c30: 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74  ult==0 ) pResult
3c40: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
3c50: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  p = whereScanNex
3c60: 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20  t(&scan);.  }.  
3c70: 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a  return pResult;.
3c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3c90: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
3ca0: 70 4c 69 73 74 20 66 6f 72 20 61 6e 20 65 6e 74  pList for an ent
3cb0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
3cc0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
3cd0: 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70  mn.** of index p
3ce0: 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
3cf0: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
3d00: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
3d10: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
3d20: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
3d30: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
3d40: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
3d50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
3d70: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
3d80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3da0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3db0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
3dc0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3dd0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3de0: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
3df0: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
3e20: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
3e30: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
3e40: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
3e70: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
3e80: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
3eb0: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
3ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
3ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
3ee0: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
3ef0: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
3f00: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
3f10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
3f20: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
3f30: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
3f40: 64 4c 69 6b 65 6c 79 28 70 4c 69 73 74 2d 3e 61  dLikely(pList->a
3f50: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
3f60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
3f70: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
3f80: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
3f90: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
3fa0: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
3fb0: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
3fc0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3fd0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
3fe0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
3ff0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4000: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
4010: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
4020: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
4030: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
4040: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
4050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4060: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
4070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4080: 20 69 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   if the iCol-th 
4090: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
40a0: 70 49 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c  pIdx is NOT NULL
40b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
40c0: 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
40d0: 6c 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  l(Index *pIdx, i
40e0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
40f0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  j;.  assert( pId
4100: 78 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x!=0 );.  assert
4110: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
4120: 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  l<pIdx->nColumn 
4130: 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61  );.  j = pIdx->a
4140: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20  iColumn[iCol];. 
4150: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
4160: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54   return pIdx->pT
4170: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  able->aCol[j].no
4180: 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  tNull;.  }else i
4190: 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( j==(-1) ){.  
41a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
41c0: 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20   j==(-2) );.    
41d0: 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73  return 0;  /* As
41e0: 73 75 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20  sume an indexed 
41f0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61  expression can a
4200: 6c 77 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55  lways yield a NU
4210: 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a  LL */..  }.}../*
4220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
4230: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4240: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
4250: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68  passed as the th
4260: 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ird argument.** 
4270: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a  is redundant..**
4280: 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c  .** A DISTINCT l
4290: 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
42a0: 20 69 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f   if any subset o
42b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
42c0: 20 74 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54   the.** DISTINCT
42d0: 20 6c 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63   list are collec
42e0: 74 69 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e  tively unique an
42f0: 64 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e  d individually n
4300: 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  on-null..*/.stat
4310: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
4320: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
4330: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4340: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
4350: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4360: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
4370: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t,        /* The
4380: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
4390: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
43a0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  WC,         /* T
43b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
43c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
43d0: 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f  Distinct       /
43e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
43f0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
4400: 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b  e DISTINCT */.){
4410: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
4420: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
4430: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a   .  int iBase;..
4460: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4470: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
4480: 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65  able or sub-sele
4490: 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
44a0: 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68  lause of.  ** th
44b0: 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
44c0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
44d0: 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74  ssible to show t
44e0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
44f0: 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73   .  ** clause is
4500: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
4510: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
4520: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
4530: 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61  0;.  iBase = pTa
4540: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
4550: 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54  sor;.  pTab = pT
4560: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
4570: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  b;..  /* If any 
4580: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
4590: 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c  ns is an IPK col
45a0: 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61  umn on table iBa
45b0: 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  se, then return 
45c0: 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65  .  ** true. Note
45d0: 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65  : The (p->iTable
45e0: 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66  ==iBase) part of
45f0: 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62   this test may b
4600: 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20  e false if the. 
4610: 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45   ** current SELE
4620: 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  CT is a correlat
4630: 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  ed sub-query..  
4640: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
4650: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
4660: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
4670: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
4680: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
4690: 69 6b 65 6c 79 28 70 44 69 73 74 69 6e 63 74 2d  ikely(pDistinct-
46a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46b0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
46c0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
46d0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
46e0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
46f0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
4700: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
4710: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
4720: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
4730: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
4740: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
4750: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4760: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
4770: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
4780: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
4790: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
47a0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
47b0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
47c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
47d0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
47e0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
47f0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
4800: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
4810: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
4820: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4830: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
4840: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
4850: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
4860: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
4870: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
4880: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
4890: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
48a0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
48b0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
48c0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
48d0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
48e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
48f0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
4900: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
4910: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
4920: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
4930: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
4940: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
4950: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
4960: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
4970: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
4980: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
4990: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
49a0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
49b0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
49c0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
49d0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
49e0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
49f0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
4a00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
4a10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
4a20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
4a30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
4a40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
4a50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
4a60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
4a70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
4a80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
4a90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
4aa0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
4ab0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
4ac0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4ad0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
4ae0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
4af0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
4b00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
4b10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4b20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
4b30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
4b40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
4b50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
4b60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
4b70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
4b80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
4b90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
4ba0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
4bb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
4bc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
4bd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
4be0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
4bf0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4c00: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4c10: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4c20: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4c30: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4c40: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4c50: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4c60: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4c70: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4c80: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4c90: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
4ca0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
4cb0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
4cc0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
4cd0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
4ce0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
4cf0: 20 49 66 20 74 68 65 20 69 41 75 74 6f 69 64 78   If the iAutoidx
4d00: 43 75 72 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  Cur is not zero,
4d10: 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77   then any OP_Row
4d20: 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  id instructions 
4d30: 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54 61  on.** cursor iTa
4d40: 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66 6f  bCur are transfo
4d50: 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 53 65 71  rmed into OP_Seq
4d60: 75 65 6e 63 65 20 6f 70 63 6f 64 65 20 66 6f 72  uence opcode for
4d70: 20 74 68 65 0a 2a 2a 20 69 41 75 74 6f 69 64 78   the.** iAutoidx
4d80: 43 75 72 20 63 75 72 73 6f 72 2c 20 69 6e 20 6f  Cur cursor, in o
4d90: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
4da0: 20 75 6e 69 71 75 65 20 72 6f 77 69 64 73 20 66   unique rowids f
4db0: 6f 72 20 74 68 65 0a 2a 2a 20 61 75 74 6f 6d 61  or the.** automa
4dc0: 74 69 63 20 69 6e 64 65 78 20 62 65 69 6e 67 20  tic index being 
4dd0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74  generated..*/.st
4de0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4df0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4e00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4e10: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4e20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
4e30: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4e40: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4e50: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
4e60: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
4e70: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
4e80: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4e90: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4ea0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4eb0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4ec0: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4ed0: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4ee0: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4ef0: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 41  ster */.  int iA
4f00: 75 74 6f 69 64 78 43 75 72 20 20 20 20 20 2f 2a  utoidxCur     /*
4f10: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 75   If non-zero, cu
4f20: 72 73 6f 72 20 6f 66 20 61 75 74 6f 69 6e 64 65  rsor of autoinde
4f30: 78 20 62 65 69 6e 67 20 67 65 6e 65 72 61 74 65  x being generate
4f40: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
4f50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4f60: 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  e;.  VdbeOp *pOp
4f70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4f80: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4f90: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4fa0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4fb0: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50  ddr(v);.  if( pP
4fc0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4fd0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4fe0: 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c  .  for(; iStart<
4ff0: 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20  iEnd; iStart++, 
5000: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pOp++){.    if( 
5010: 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72  pOp->p1!=iTabCur
5020: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5030: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5040: 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
5050: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
5060: 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20   = OP_Copy;.    
5070: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d    pOp->p1 = pOp-
5080: 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b  >p2 + iRegister;
5090: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
50a0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
50b0: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20  pOp->p3 = 0;.   
50c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
50d0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
50e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 41   ){.      if( iA
50f0: 75 74 6f 69 64 78 43 75 72 20 29 7b 0a 20 20 20  utoidxCur ){.   
5100: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
5110: 20 3d 20 4f 50 5f 53 65 71 75 65 6e 63 65 3b 0a   = OP_Sequence;.
5120: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
5130: 3d 20 69 41 75 74 6f 69 64 78 43 75 72 3b 0a 20  = iAutoidxCur;. 
5140: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5150: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
5160: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
5170: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
5180: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
5190: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
51a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
51b0: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
51c0: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
51d0: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
51e0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
51f0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
5200: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
5210: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
5220: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
5230: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
5240: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
5250: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
5260: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
5270: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
5280: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5290: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
52a0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
52b0: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
52c0: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
52d0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
52e0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
52f0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
5300: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
5310: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
5320: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5330: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
5340: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
5350: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5360: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
5370: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
5380: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
5390: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
53a0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
53b0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
53c0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
53d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
53e0: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
53f0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
5400: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
5410: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
5420: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
5430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5440: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
5450: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5460: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
5470: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
5480: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
5490: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
54a0: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
54b0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
54c0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
54d0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
54e0: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
54f0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
5500: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
5510: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
5520: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
5530: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5540: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
5550: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
5560: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5570: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
5580: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
5590: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
55a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
55b0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
55c0: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
55d0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
55e0: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
55f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
5600: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
5610: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
5620: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
5630: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
5640: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
5650: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
5660: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
5670: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
5680: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
5690: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
56a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56b0: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
56c0: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
56d0: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
56e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56f0: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
5700: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
5710: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
5720: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
5730: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
5740: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
5750: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
5760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
5770: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5780: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
5790: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
57a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
57b0: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
57c0: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
57d0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
57e0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
57f0: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
5800: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
5810: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
5820: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
5830: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
5840: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
5850: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5870: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
5880: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
5890: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58a0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
58b0: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
58c0: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
58d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
58e0: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
58f0: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
5900: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
5910: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
5920: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
5930: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
5940: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
5950: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5960: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
5970: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
5980: 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _IS))==0 ) retur
5990: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 72 63  n 0;.  if( (pSrc
59a0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
59b0: 4a 54 5f 4c 45 46 54 29 20 0a 20 20 20 26 26 20  JT_LEFT) .   && 
59c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
59d0: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
59e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26  P_FromJoin).   &
59f0: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
5a00: 74 6f 72 20 26 20 57 4f 5f 49 53 29 0a 20 20 29  tor & WO_IS).  )
5a10: 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  {.    /* Cannot 
5a20: 75 73 65 20 61 6e 20 49 53 20 74 65 72 6d 20 66  use an IS term f
5a30: 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c  rom the WHERE cl
5a40: 61 75 73 65 20 61 73 20 61 6e 20 69 6e 64 65 78  ause as an index
5a50: 20 64 72 69 76 65 72 20 66 6f 72 0a 20 20 20 20   driver for.    
5a60: 2a 2a 20 74 68 65 20 52 48 53 20 6f 66 20 61 20  ** the RHS of a 
5a70: 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 75 63 68 20  LEFT JOIN. Such 
5a80: 61 20 74 65 72 6d 20 63 61 6e 20 6f 6e 6c 79 20  a term can only 
5a90: 62 65 20 75 73 65 64 20 69 66 20 69 74 20 69 73  be used if it is
5aa0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
5ab0: 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a   ON clause.  */.
5ac0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5ad0: 7d 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  }.  if( (pTerm->
5ae0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
5af0: 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
5b00: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
5b10: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5b20: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
5b30: 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
5b40: 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
5b50: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
5b60: 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
5b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5b80: 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
5b90: 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
5ba0: 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   0;.  testcase( 
5bb0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
5bc0: 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65 74  ==TK_IS );.  ret
5bd0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
5be0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5bf0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
5c00: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
5c10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
5c20: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
5c30: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
5c40: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
5c50: 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
5c60: 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
5c70: 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
5c80: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
5c90: 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
5ca0: 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
5cb0: 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
5cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
5cd0: 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
5ce0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
5cf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
5d00: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5d10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
5d20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
5d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5d40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5d50: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5d60: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
5d70: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
5d80: 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
5d90: 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
5da0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
5db0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
5dc0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
5dd0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
5de0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
5df0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
5e10: 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
5e20: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b  e */.){.  int nK
5e30: 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
5e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5e50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
5e60: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
5e70: 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
5e80: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
5e90: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
5ea0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
5eb0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
5ec0: 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
5ed0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
5ee0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
5ef0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f10: 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
5f20: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
5f30: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
5f40: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
5f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
5f60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
5f70: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5f80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
5f90: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
5fa0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5fb0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
5fc0: 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
5fd0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
5fe0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
5ff0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
6000: 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
6010: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6030: 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
6040: 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
6050: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6070: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
6080: 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
6090: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
60c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
60f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
6100: 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
6110: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
6120: 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
6130: 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
6140: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
6150: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
6160: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
6170: 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
6180: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
6190: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
61a0: 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
61b0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  t */.  char *zNo
61c0: 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  tUsed;          
61d0: 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
61e0: 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  e on the end of 
61f0: 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  pIdx */.  Bitmas
6200: 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
6210: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
6220: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
6230: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
6240: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
6250: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
6260: 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
6270: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
6280: 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e  .  u8 sentWarnin
6290: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
62a0: 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e  * True if a warn
62b0: 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73  ning has been is
62c0: 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sued */.  Expr *
62d0: 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20 20  pPartial = 0;   
62e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61 6c        /* Partial
62f0: 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69 6f   Index Expressio
6300: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  n */.  int iCont
6310: 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20 20  inue = 0;       
6320: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
6330: 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65 64  to skip excluded
6340: 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75 63   rows */.  struc
6350: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
6360: 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
6370: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
6380: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
6390: 20 20 69 6e 74 20 61 64 64 72 43 6f 75 6e 74 65    int addrCounte
63a0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  r = 0;        /*
63b0: 20 41 64 64 72 65 73 73 20 77 68 65 72 65 20 69   Address where i
63c0: 6e 74 65 67 65 72 20 63 6f 75 6e 74 65 72 20 69  nteger counter i
63d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  s initialized */
63e0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6400: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
6410: 74 65 72 73 20 77 68 65 72 65 20 72 65 63 6f 72  ters where recor
6420: 64 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20 2a  d is assembled *
6430: 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
6440: 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
6450: 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
6460: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
6470: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
6480: 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
6490: 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
64a0: 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
64b0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
64c0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
64d0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
64e0: 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69  !=0 );.  addrIni
64f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
6500: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
6510: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6520: 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  v);..  /* Count 
6530: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6540: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
6550: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
6560: 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
6570: 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
6580: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
6590: 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43  aints */.  nKeyC
65a0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
65b0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
65c0: 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
65d0: 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
65e0: 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
65f0: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
6600: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
6610: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
6620: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
6630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
6640: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
6650: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
6660: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
6670: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
6680: 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65  oin)    /* prere
6690: 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72  q always non-zer
66a0: 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c  o */.         ||
66b0: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
66c0: 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  inTable!=pSrc->i
66d0: 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f  Cursor   /*   fo
66e0: 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  r the right-hand
66f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c     */.         |
6700: 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21  | pLoop->prereq!
6710: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
6720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74            /*   t
6730: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
6740: 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  OIN */.    if( p
6750: 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a  Loop->prereq==0.
6760: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
6770: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
6780: 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20  IRTUAL)==0.     
6790: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
67a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
67b0: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20  omJoin).     && 
67c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
67d0: 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  leConstant(pExpr
67e0: 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
67f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69   ){.      pParti
6800: 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
6810: 41 6e 64 28 70 50 61 72 73 65 2c 20 70 50 61 72  And(pParse, pPar
6820: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6850: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
6860: 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20   pExpr, 0));.   
6870: 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43   }.    if( termC
6880: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
6890: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
68a0: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
68b0: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
68c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
68d0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
68e0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
68f0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
6900: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
6910: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6920: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
6930: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
6940: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
6950: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
6960: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
6970: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6980: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
6990: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
69a0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
69b0: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
69c0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
69d0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
69e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
69f0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
6a00: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
6a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
6a20: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
6a30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6a40: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
6a50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
6a60: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
6a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
6a80: 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
6a90: 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20  create;.        
6aa0: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  }.        pLoop-
6ab0: 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b  >aLTerm[nKeyCol+
6ac0: 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
6ad0: 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
6ae0: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
6af0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6b00: 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20  ( nKeyCol>0 );. 
6b10: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
6b20: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  nEq = pLoop->nLT
6b30: 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20  erm = nKeyCol;. 
6b40: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
6b50: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
6b60: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
6b70: 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
6b80: 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
6b90: 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f          | WHERE_
6ba0: 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f  AUTO_INDEX;..  /
6bb0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6bc0: 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
6bd0: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
6be0: 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
6bf0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
6c00: 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
6c10: 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
6c20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
6c30: 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
6c40: 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
6c50: 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
6c60: 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
6c70: 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
6c80: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
6c90: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
6ca0: 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
6cb0: 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
6cc0: 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
6cd0: 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
6ce0: 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
6cf0: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
6d00: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
6d10: 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
6d20: 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
6d30: 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
6d40: 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
6d50: 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
6d60: 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
6d70: 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
6d80: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6d90: 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b  (~idxCols | MASK
6da0: 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d  BIT(BMS-1));.  m
6db0: 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d  xBitCol = MIN(BM
6dc0: 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  S-1,pTable->nCol
6dd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
6de0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
6df0: 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
6e00: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
6e10: 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
6e20: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6e30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6e40: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6e50: 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b  T(i) ) nKeyCol++
6e60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
6e70: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
6e80: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
6e90: 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61    nKeyCol += pTa
6ea0: 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
6eb0: 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  + 1;.  }..  /* C
6ec0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
6ed0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
6ee0: 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
6ef0: 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
6f00: 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
6f10: 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e  xObject(pParse->
6f20: 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30  db, nKeyCol+1, 0
6f30: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
6f40: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f  if( pIdx==0 ) go
6f50: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6f60: 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f  x_create;.  pLoo
6f70: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
6f80: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
6f90: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
6fa0: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
6fb0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
6fc0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
6fd0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
6fe0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
6ff0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
7000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
7010: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
7020: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
7030: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
7040: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
7050: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
7060: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
7070: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
7080: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
7090: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
70a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
70b0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
70c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
70d0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
70e0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
70f0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
7100: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
7110: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
7120: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
7130: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
7140: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
7150: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
7160: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
7170: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
7180: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
7190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
71a0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
71b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
71c0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
71d0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
71e0: 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33 53  zName : sqlite3S
71f0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
7200: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
7210: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
7220: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
7230: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
7240: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
7250: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
7260: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
7270: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
7280: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
7290: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
72a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
72b0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
72c0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
72d0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
72e0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
72f0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
7300: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
7310: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
7320: 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  ARY;.      n++;.
7330: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
7340: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
7350: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
7360: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
7370: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
7380: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
7390: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
73a0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
73b0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
73c0: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
73d0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
73e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
73f0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
7400: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
7410: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70   = XN_ROWID;.  p
7420: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
7430: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7440: 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  Y;..  /* Create 
7450: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
7460: 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
7470: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
7480: 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  >=0 );.  pLevel-
7490: 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
74a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
74b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
74c0: 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
74d0: 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
74e0: 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b  Cur, nKeyCol+1);
74f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
7500: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
7510: 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65  e, pIdx);.  Vdbe
7520: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
7530: 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
7540: 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
7550: 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
7560: 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
7570: 6e 74 20 2a 2f 0a 20 20 70 54 61 62 49 74 65 6d  nt */.  pTabItem
7580: 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d   = &pWC->pWInfo-
7590: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
75a0: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
75b0: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
75c0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
75d0: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
75e0: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
75f0: 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64 64 72  Return;.    addr
7600: 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  Counter = sqlite
7610: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7620: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
7630: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7640: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7650: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
7660: 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74  Yield, 0, pTabIt
7670: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
7680: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
76a0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
76b0: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
76c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
76d0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
76e0: 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
76f0: 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e   %s", pTabItem->
7700: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
7710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
7720: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
7730: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
7740: 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  wind, pLevel->iT
7750: 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65  abCur); VdbeCove
7760: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
7770: 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20  f( pPartial ){. 
7780: 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73     iContinue = s
7790: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
77a0: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
77b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
77c0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  lse(pParse, pPar
77d0: 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  tial, iContinue,
77e0: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
77f0: 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  LL);.    pLoop->
7800: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
7810: 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d  _PARTIALIDX;.  }
7820: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
7830: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7840: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 42  (pParse);.  regB
7850: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 6e  ase = sqlite3Gen
7860: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20  erateIndexKey(. 
7870: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49 64       pParse, pId
7880: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
7890: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  ur, regRecord, 0
78a0: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  , 0, 0, 0.  );. 
78b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
78c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
78d0: 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt, pLevel->iIdx
78e0: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Cur, regRecord);
78f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
7900: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7910: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
7920: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
7930: 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
7940: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
7950: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
7960: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
7970: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7980: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7990: 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e 74  eP2(v, addrCount
79a0: 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b 0a  er, regBase+n);.
79b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
79c0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
79d0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
79e0: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
79f0: 64 78 43 75 72 3e 30 20 29 3b 0a 20 20 20 20 74  dxCur>0 );.    t
7a00: 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
7a10: 43 6f 70 79 28 70 50 61 72 73 65 2c 20 61 64 64  Copy(pParse, add
7a20: 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  rTop, pLevel->iT
7a30: 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
7a60: 73 75 6c 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sult, pLevel->iI
7a70: 64 78 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69  dxCur);.    sqli
7a80: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
7a90: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61  ddrTop);.    pTa
7aa0: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
7ab0: 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  outine = 0;.  }e
7ac0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7ad0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7ae0: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
7af0: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
7b00: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
7b10: 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
7b20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7b30: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
7b40: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
7b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
7b60: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
7b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
7b80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7b90: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
7ba0: 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
7bb0: 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
7bc0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
7bd0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
7be0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7bf0: 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75  drInit);..end_au
7c00: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a  to_index_create:
7c10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
7c20: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7c30: 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65   pPartial);.}.#e
7c40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7c50: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
7c60: 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
7c70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7c80: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
7c90: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
7ca0: 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
7cb0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7cc0: 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
7cd0: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
7ce0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
7cf0: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
7d00: 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
7d10: 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
7d20: 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
7d30: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
7d40: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
7d50: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
7d60: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
7d70: 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
7d80: 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
7d90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7db0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
7dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
7dd0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7df0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 62  e WHERE clause b
7e00: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
7e10: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
7e20: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
7e30: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72     /* Ignore ter
7e40: 6d 73 20 77 69 74 68 20 74 68 65 73 65 20 70 72  ms with these pr
7e50: 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63  ereqs */.  struc
7e60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7e70: 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68  pSrc,      /* Th
7e80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
7e90: 72 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 76  rm that is the v
7ea0: 74 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  tab */.  ExprLis
7eb0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
7ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7ed0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
7ee0: 2a 2f 0a 20 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d  */.  u16 *pmNoOm
7ef0: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
7f00: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
7f10: 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f 6d 69  terms not to omi
7f20: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  t */.){.  int i,
7f30: 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
7f40: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7f50: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7f60: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
7f70: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7f80: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
7f90: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
7fa0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7fb0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7fc0: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 73 74  ge *pUsage;.  st
7fd0: 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78  ruct HiddenIndex
7fe0: 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 3b 0a 20  Info *pHidden;. 
7ff0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
8000: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
8010: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
8020: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
8030: 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  o;.  u16 mNoOmit
8040: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e   = 0;..  /* Coun
8050: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
8060: 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
8070: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
8080: 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
8090: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
80a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
80b0: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
80c0: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
80d0: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
80e0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
80f0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
8100: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
8110: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8120: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
8130: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
8140: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
8150: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
8160: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
8170: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
8180: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
8190: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
81a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
81b0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
81c0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
81d0: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
81e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
81f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8200: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
8210: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8220: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8230: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
8240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8250: 20 26 20 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d   & ~(WO_EQUIV))=
8260: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8270: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
8280: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
8290: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
82a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
82b0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
82c0: 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72  (-1) );.    nTer
82d0: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
82e0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
82f0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
8300: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
8310: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
8320: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
8330: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
8340: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
8350: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
8360: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
8370: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
8380: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
8390: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
83a0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
83b0: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
83c0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
83d0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
83e0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
83f0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8400: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
8410: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
8420: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
8430: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
8440: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
8450: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
8460: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
8470: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
8480: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
8490: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
84a0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
84b0: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
84c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
84d0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
84e0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
84f0: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
8520: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
8530: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8550: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
8560: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
8570: 79 29 2a 6e 4f 72 64 65 72 42 79 20 2b 20 73 69  y)*nOrderBy + si
8580: 7a 65 6f 66 28 2a 70 48 69 64 64 65 6e 29 20 29  zeof(*pHidden) )
8590: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
85a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
85b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
85c0: 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
85d0: 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  y");.    return 
85e0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
85f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
8600: 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
8610: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
8620: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
8630: 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
8640: 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
8650: 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
8660: 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
8670: 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
8680: 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
8690: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
86a0: 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
86b0: 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
86c0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
86d0: 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
86e0: 48 69 64 64 65 6e 20 3d 20 28 73 74 72 75 63 74  Hidden = (struct
86f0: 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
8700: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
8710: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
8720: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8730: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
8740: 70 48 69 64 64 65 6e 5b 31 5d 3b 0a 20 20 70 49  pHidden[1];.  pI
8750: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
8760: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
8770: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
8780: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
8790: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
87a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
87b0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
87c0: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
87d0: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
87e0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
87f0: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
8800: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
8810: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
8820: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
8830: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8840: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
8850: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
8860: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
8870: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
8880: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
8890: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
88a0: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
88b0: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
88c0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
88d0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
88e0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
88f0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
8900: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
8950: 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 20 3d 20   pHidden->pWC = 
8960: 70 57 43 3b 0a 20 20 70 48 69 64 64 65 6e 2d 3e  pWC;.  pHidden->
8970: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
8980: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
8990: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
89a0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
89b0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 31 36  Term++){.    u16
89c0: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
89d0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
89e0: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
89f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8a00: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
8a10: 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62  qRight & mUnusab
8a20: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
8a30: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
8a40: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
8a50: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
8a60: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
8a70: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
8a80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
8a90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8aa0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8ab0: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
8ac0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
8ad0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8ae0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
8af0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8b00: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
8b10: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
8b20: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8b30: 26 20 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d  & ~(WO_EQUIV))==
8b40: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8b50: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
8b60: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
8b70: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
8b80: 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e    if( (pSrc->fg.
8b90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
8ba0: 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 21  FT)!=0.     && !
8bb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8bc0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
8bd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
8be0: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
8bf0: 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 7c 57 4f  ator & (WO_IS|WO
8c00: 5f 49 53 4e 55 4c 4c 29 29 0a 20 20 20 20 29 7b  _ISNULL)).    ){
8c10: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 49 53  .      /* An "IS
8c20: 22 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  " term in the WH
8c30: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
8c40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
8c50: 6c 65 20 69 73 20 74 68 65 20 72 68 73 0a 20 20  le is the rhs.  
8c60: 20 20 20 20 2a 2a 20 6f 66 20 61 20 4c 45 46 54      ** of a LEFT
8c70: 20 4a 4f 49 4e 2e 20 44 6f 20 6e 6f 74 20 70 61   JOIN. Do not pa
8c80: 73 73 20 74 68 69 73 20 74 65 72 6d 20 74 6f 20  ss this term to 
8c90: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
8ca0: 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  e.      ** imple
8cb0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 73 20 74 68  mentation, as th
8cc0: 69 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 69  is can lead to i
8cd0: 6e 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73  ncorrect results
8ce0: 20 66 72 6f 6d 20 53 51 4c 20 73 75 63 68 0a 20   from SQL such. 
8cf0: 20 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20       ** as:.    
8d00: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
8d10: 22 4c 45 46 54 20 4a 4f 49 4e 20 76 74 61 62 20  "LEFT JOIN vtab 
8d20: 57 48 45 52 45 20 76 74 61 62 2e 63 6f 6c 20 49  WHERE vtab.col I
8d30: 53 20 4e 55 4c 4c 22 20 20 2a 2f 0a 20 20 20 20  S NULL"  */.    
8d40: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8d50: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8d60: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
8d70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8d80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8d90: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 63 6f  O_IS );.      co
8da0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
8db0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8dc0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28  >u.leftColumn>=(
8dd0: 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43  -1) );.    pIdxC
8de0: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
8df0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
8e00: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
8e10: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
8e20: 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
8e30: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8e40: 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
8e50: 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
8e60: 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 69  p = WO_EQ;.    i
8e70: 66 28 20 6f 70 3d 3d 57 4f 5f 41 55 58 20 29 7b  f( op==WO_AUX ){
8e80: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
8e90: 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  j].op = pTerm->e
8ea0: 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 65 6c  MatchOp;.    }el
8eb0: 73 65 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f  se if( op & (WO_
8ec0: 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b  ISNULL|WO_IS) ){
8ed0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  .      if( op==W
8ee0: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
8ef0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8f00: 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  op = SQLITE_INDE
8f10: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e  X_CONSTRAINT_ISN
8f20: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
8f30: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f  {.        pIdxCo
8f40: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54  ns[j].op = SQLIT
8f50: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8f60: 4e 54 5f 49 53 3b 0a 20 20 20 20 20 20 7d 0a 20  NT_IS;.      }. 
8f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f80: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8f90: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 2f   (u8)op;.      /
8fa0: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
8fb0: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
8fc0: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
8fd0: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
8fe0: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
8ff0: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
9000: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9010: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
9020: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
9030: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
9040: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
9050: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
9060: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
9070: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
9080: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
9090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
90a0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
90b0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
90c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
90d0: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
90e0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
90f0: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LE );.      ass
9100: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
9110: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9120: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  INT_GT );.      
9130: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
9140: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9150: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
9160: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
9170: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
9180: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
9190: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
91a0: 7c 57 4f 5f 41 55 58 29 20 29 3b 0a 0a 20 20 20  |WO_AUX) );..   
91b0: 20 20 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f     if( op & (WO_
91c0: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
91d0: 4f 5f 47 45 29 0a 20 20 20 20 20 20 20 26 26 20  O_GE).       && 
91e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
91f0: 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  tor(pTerm->pExpr
9200: 2d 3e 70 52 69 67 68 74 29 20 0a 20 20 20 20 20  ->pRight) .     
9210: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
9220: 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c  i<16 ) mNoOmit |
9230: 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20  = (1 << i);.    
9240: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c      if( op==WO_L
9250: 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e  T ) pIdxCons[j].
9260: 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20  op = WO_LE;.    
9270: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47      if( op==WO_G
9280: 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e  T ) pIdxCons[j].
9290: 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20  op = WO_GE;.    
92a0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a    }.    }..    j
92b0: 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
92c0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
92d0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
92e0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
92f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9300: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
9310: 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
9320: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
9330: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
9340: 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
9350: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
9360: 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d  }..  *pmNoOmit =
9370: 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65 74 75   mNoOmit;.  retu
9380: 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
9390: 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
93a0: 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
93b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
93c0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
93d0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
93e0: 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
93f0: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
9400: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
9410: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
9420: 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
9430: 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
9440: 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
9450: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
9460: 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
9470: 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
9480: 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
9490: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
94a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
94b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
94c0: 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
94d0: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
94e0: 65 73 73 61 67 65 20 61 6e 64 20 61 6e 0a 2a 2a  essage and an.**
94f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
9500: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
9510: 6e 65 64 2e 20 20 41 20 72 65 74 75 72 6e 20 6f  ned.  A return o
9520: 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  f SQLITE_CONSTRA
9530: 49 4e 54 20 66 72 6f 6d 0a 2a 2a 20 78 42 65 73  INT from.** xBes
9540: 74 49 6e 64 65 78 20 69 73 20 6e 6f 74 20 63 6f  tIndex is not co
9550: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
9560: 72 2e 20 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  r.  SQLITE_CONST
9570: 52 41 49 4e 54 20 69 6e 64 69 63 61 74 65 73 20  RAINT indicates 
9580: 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 75 72 72  that.** the curr
9590: 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ent configuratio
95a0: 6e 20 6f 66 20 22 75 6e 75 73 61 62 6c 65 22 20  n of "unusable" 
95b0: 66 6c 61 67 73 20 69 6e 20 73 71 6c 69 74 65 33  flags in sqlite3
95c0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 63 61 6e 0a  _index_info can.
95d0: 2a 2a 20 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e  ** not result in
95e0: 20 61 20 76 61 6c 69 64 20 70 6c 61 6e 2e 0a 2a   a valid plan..*
95f0: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
9600: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
9610: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
9620: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
9630: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
9640: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
9650: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
9660: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
9670: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
9680: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
9690: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
96a0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
96b0: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
96c0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
96d0: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
96e0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
96f0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
9700: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
9710: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
9720: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
9730: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
9740: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
9750: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
9760: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
9770: 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
9780: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
9790: 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
97a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
97b0: 21 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  !=SQLITE_CONSTRA
97c0: 49 4e 54 20 29 7b 0a 20 20 20 20 69 66 28 20 72  INT ){.    if( r
97d0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
97e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
97f0: 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d  OomFault(pParse-
9800: 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >db);.    }else 
9810: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
9820: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
9830: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9840: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
9850: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
9860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9870: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9880: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
9890: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
98a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
98b0: 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
98c0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
98d0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
98e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
98f0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
9900: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
9910: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
9920: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
9930: 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  BLE_STAT4./*.** 
9940: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63  Estimate the loc
9950: 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69  ation of a parti
9960: 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20  cular key among 
9970: 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a  all keys in an.*
9980: 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20  * index.  Store 
9990: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
99a0: 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  Stat as follows:
99b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  .**.**    aStat[
99c0: 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  0]      Est. num
99d0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73  ber of rows less
99e0: 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20   than pRec.**   
99f0: 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45   aStat[1]      E
9a00: 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
9a10: 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  ws equal to pRec
9a20: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
9a30: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73  e index of the s
9a40: 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68  ample that is th
9a50: 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  e smallest sampl
9a60: 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65  e that.** is gre
9a70: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
9a80: 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65  al to pRec. Note
9a90: 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78   that this index
9aa0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78   is not an index
9ab0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61  .** into the aSa
9ac0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69  mple[] array - i
9ad0: 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e  t is an index in
9ae0: 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74  to a virtual set
9af0: 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62   of samples.** b
9b00: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
9b10: 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b  ents of aSample[
9b20: 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
9b30: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65   of fields in re
9b40: 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a  cord .** pRec. .
9b50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
9b60: 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
9b70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9b90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9ba0: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
9bb0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
9bc0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
9bd0: 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
9be0: 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
9bf0: 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
9c00: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
9c10: 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
9c20: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
9c30: 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
9c40: 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
9c50: 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
9c60: 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
9c70: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
9c80: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
9c90: 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
9ca0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
9cb0: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
9cc0: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
9cd0: 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
9ce0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
9cf0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
9d00: 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
9d10: 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
9d20: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
9d50: 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65  st sample >= pRe
9d60: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70  c */.  int iSamp
9d70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
9d80: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
9d90: 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
9da0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
9db0: 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e  ec */.  int iMin
9dc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9dd0: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
9de0: 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74  sample not yet t
9df0: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
9e00: 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
9e10: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73         /* Next s
9e20: 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f  ample to test */
9e30: 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e50: 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  * Result of comp
9e60: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
9e70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
9e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9e90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9ea0: 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f  ields in pRec */
9eb0: 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65  .  tRowcnt iLowe
9ec0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  r = 0;         /
9ed0: 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b  * anLt[] + anEq[
9ee0: 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d  ] of largest sam
9ef0: 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f  ple pRec is > */
9f00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f10: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
9f20: 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
9f30: 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
9f40: 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
9f50: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
9f60: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
9f70: 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46  assert( pRec->nF
9f80: 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e  ield>0 && pRec->
9f90: 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53  nField<=pIdx->nS
9fa0: 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f  ampleCol );..  /
9fb0: 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65  * Do a binary se
9fc0: 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65  arch to find the
9fd0: 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72   first sample gr
9fe0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
9ff0: 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63  ual.  ** to pRec
a000: 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  . If pRec contai
a010: 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ns a single fiel
a020: 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61  d, the set of sa
a030: 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a  mples to search.
a040: 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74    ** is simply t
a050: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
a060: 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c  ay. If the sampl
a070: 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  es in aSample[] 
a080: 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a  contain more.  *
a090: 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64  * than one field
a0a0: 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f  s, all fields fo
a0b0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73  llowing the firs
a0c0: 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20  t are ignored.. 
a0d0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63   **.  ** If pRec
a0e0: 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
a0f0: 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d  ds, where N is m
a100: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68  ore than one, th
a110: 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  en as well as th
a120: 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69  e.  ** samples i
a130: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75  n aSample[] (tru
a140: 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c  ncated to N fiel
a150: 64 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20  ds), the search 
a160: 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a  also has to.  **
a170: 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78   consider prefix
a180: 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70  es of those samp
a190: 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  les. For example
a1a0: 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  , if the set of 
a1b0: 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20  samples.  ** in 
a1c0: 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a  aSample is:.  **
a1d0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a1e0: 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20  e[0] = (a, 5) . 
a1f0: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a200: 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20  1] = (a, 10) .  
a210: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32  **     aSample[2
a220: 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a  ] = (b, 5) .  **
a230: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20       aSample[3] 
a240: 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a  = (c, 100) .  **
a250: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20       aSample[4] 
a260: 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a  = (c, 105).  **.
a270: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65    ** Then the se
a280: 61 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c  arch space shoul
a290: 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65  d ideally be the
a2a0: 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61   samples above a
a2b0: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69  nd the .  ** uni
a2c0: 71 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d  que prefixes [a]
a2d0: 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42  , [b] and [c]. B
a2e0: 75 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73  ut since that is
a2f0: 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a   hard to organiz
a300: 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  e, .  ** the cod
a310: 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63  e actually searc
a320: 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20  hes this set:.  
a330: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28  **.  **     0: (
a340: 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20  a) .  **     1: 
a350: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
a360: 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   2: (a, 10) .  *
a370: 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29  *     3: (a, 10)
a380: 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62   .  **     4: (b
a390: 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28  ) .  **     5: (
a3a0: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
a3b0: 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20  6: (c) .  **    
a3c0: 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20   7: (c, 100) .  
a3d0: 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30  **     8: (c, 10
a3e0: 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28  5).  **     9: (
a3f0: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a  c, 105).  **.  *
a400: 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c  * For each sampl
a410: 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  e in the aSample
a420: 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70  [] array, N samp
a430: 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  les are present 
a440: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65  in the.  ** effe
a450: 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72  ctive sample arr
a460: 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65  ay. In the above
a470: 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20  , samples 0 and 
a480: 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a  1 are based on .
a490: 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d    ** sample aSam
a4a0: 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20  ple[0]. Samples 
a4b0: 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70  2 and 3 on aSamp
a4c0: 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a  le[1] etc..  **.
a4d0: 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70    ** Often, samp
a4e0: 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f  le i of each blo
a4f0: 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76  ck of N effectiv
a500: 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69  e samples has (i
a510: 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a  +1) fields..  **
a520: 20 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61   Except, each sa
a530: 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65  mple may be exte
a540: 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  nded to ensure t
a550: 68 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65  hat it is greate
a560: 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65  r than or.  ** e
a570: 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76  qual to the prev
a580: 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74  ious sample in t
a590: 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78  he array. For ex
a5a0: 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62  ample, in the ab
a5b0: 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c  ove, .  ** sampl
a5c0: 65 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74  e 2 is the first
a5d0: 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f   sample of a blo
a5e0: 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c  ck of N samples,
a5f0: 20 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20   so at first it 
a600: 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68  .  ** appears th
a610: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  at it should be 
a620: 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e  1 field in size.
a630: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77   However, that w
a640: 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20  ould make it .  
a650: 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
a660: 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65  sample 1, so the
a670: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77   binary search w
a680: 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41  ould not work. A
a690: 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a  s a result, .  *
a6a0: 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64  * it is extended
a6b0: 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20   to two fields. 
a6c0: 54 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74  The duplicates t
a6d0: 68 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73  hat this creates
a6e0: 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61   do not .  ** ca
a6f0: 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
a700: 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ..  */.  nField 
a710: 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a  = pRec->nField;.
a720: 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53    iCol = 0;.  iS
a730: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53  ample = pIdx->nS
a740: 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a  ample * nField;.
a750: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53    do{.    int iS
a760: 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  amp;            
a770: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a780: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66   in aSample[] of
a790: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
a7a0: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
a7d0: 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61  ields in test sa
a7e0: 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65  mple */..    iTe
a7f0: 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70  st = (iMin+iSamp
a800: 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70  le)/2;.    iSamp
a810: 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c   = iTest / nFiel
a820: 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70  d;.    if( iSamp
a830: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
a840: 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65  he proposed effe
a850: 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20  ctive sample is 
a860: 61 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  a prefix of samp
a870: 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  le aSample[iSamp
a880: 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63  ]..      ** Spec
a890: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68  ifically, the sh
a8a0: 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66  ortest prefix of
a8b0: 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69   at least (1 + i
a8c0: 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20  Test%nField) .  
a8d0: 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68      ** fields th
a8e0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
a8f0: 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
a900: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
a910: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
a920: 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c  n=(iTest % nFiel
a930: 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64  d) + 1; n<nField
a940: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
a950: 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  if( aSample[iSam
a960: 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d  p-1].anLt[n-1]!=
a970: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
a980: 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b  nLt[n-1] ) break
a990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69  lse{.      n = i
a9b0: 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  Test + 1;.    }.
a9c0: 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  .    pRec->nFiel
a9d0: 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d  d = n;.    res =
a9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
a9f0: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
aa00: 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d  e[iSamp].n, aSam
aa10: 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52  ple[iSamp].p, pR
aa20: 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ec);.    if( res
aa30: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  <0 ){.      iLow
aa40: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
aa50: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20  mp].anLt[n-1] + 
aa60: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
aa70: 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20  nEq[n-1];.      
aa80: 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
aa90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
aaa0: 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64  s==0 && n<nField
aab0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
aac0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   = aSample[iSamp
aad0: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20  ].anLt[n-1];.   
aae0: 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
aaf0: 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d  1;.      res = -
ab00: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
ab10: 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54      iSample = iT
ab20: 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20  est;.      iCol 
ab30: 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n-1;.    }.  }
ab40: 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d  while( res && iM
ab50: 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20  in<iSample );.  
ab60: 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46  i = iSample / nF
ab70: 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  ield;..#ifdef SQ
ab80: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
ab90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
aba0: 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
abb0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62  check that the b
abc0: 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64  inary search cod
abd0: 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75  e.  ** above fou
abe0: 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73  nd the right ans
abf0: 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  wer. This block 
ac00: 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73  serves no purpos
ac10: 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  e other.  ** tha
ac20: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
ac30: 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69  asserts.  */.  i
ac40: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
ac50: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
ac60: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  {.    if( res==0
ac70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ac80: 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65  (res==0) is true
ac90: 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  , then pRec must
aca0: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   be equal to sam
acb0: 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20  ple i. */.      
acc0: 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
acd0: 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20  nSample );.     
ace0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
acf0: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20  Field-1 );.     
ad00: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
ad10: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73  nField;.      as
ad20: 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
ad30: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
ad40: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
ad50: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
ad60: 65 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  ec) .           
ad70: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
ad80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20  allocFailed .   
ad90: 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
ada0: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73  .      /* Unless
adb0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
adc0: 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  e, indicating th
add0: 61 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65  at pRec is large
ade0: 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  r than.      ** 
adf0: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74  all samples in t
ae00: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
ae10: 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65  ay, pRec must be
ae20: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
ae30: 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c  e.      ** (iCol
ae40: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
ae50: 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a   of sample i.  *
ae60: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
ae70: 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i<=pIdx->nSample
ae80: 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20   && i>=0 );.    
ae90: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
aea0: 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61   iCol+1;.      a
aeb0: 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e  ssert( i==pIdx->
aec0: 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
aed0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
aee0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
aef0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
af00: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
af10: 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  )>0.           |
af20: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
af30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
af40: 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20       /* if i==0 
af50: 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65  and iCol==0, the
af60: 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73  n record pRec is
af70: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c   smaller than al
af80: 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20  l samples.      
af90: 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  ** in the aSampl
afa0: 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72  e[] array. Other
afb0: 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30  wise, if (iCol>0
afc0: 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  ) then pRec must
afd0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65  .      ** be gre
afe0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
aff0: 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29  al to the (iCol)
b000: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
b010: 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20   sample i..     
b020: 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68   ** If (i>0), th
b030: 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73  en pRec must als
b040: 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
b050: 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20  n sample (i-1). 
b060: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43   */.      if( iC
b070: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
b080: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  pRec->nField = i
b090: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Col;.        ass
b0a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
b0b0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
b0c0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
b0d0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c  ple[i].p, pRec)<
b0e0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
b0f0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
b100: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b120: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
b130: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
b140: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61  Field;.        a
b150: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
b160: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
b170: 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20  aSample[i-1].n, 
b180: 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20  aSample[i-1].p, 
b190: 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20  pRec)<0.        
b1a0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
b1b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b1c0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
b1d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b1e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
b1f0: 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73  UG */..  if( res
b200: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ==0 ){.    /* Re
b210: 63 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75  cord pRec is equ
b220: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a  al to sample i *
b230: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  /.    assert( iC
b240: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
b250: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61      aStat[0] = a
b260: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
b270: 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b  Col];.    aStat[
b280: 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
b290: 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65  anEq[iCol];.  }e
b2a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74  lse{.    /* At t
b2b0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28  his point, the (
b2c0: 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72  iCol+1) field pr
b2d0: 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b  efix of aSample[
b2e0: 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
b2f0: 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74  .    ** sample t
b300: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
b310: 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66  han pRec. Or, if
b320: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
b330: 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20  e then pRec.    
b340: 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
b350: 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  n all samples in
b360: 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20   the array. */. 
b370: 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
b380: 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
b390: 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
b3a0: 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65  e ){.      iUppe
b3b0: 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  r = sqlite3LogEs
b3c0: 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52  tToInt(pIdx->aiR
b3d0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
b3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b3f0: 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Upper = aSample[
b400: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
b410: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c     }..    if( iL
b420: 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
b430: 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
b440: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b450: 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
b460: 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
b470: 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
b480: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
b490: 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
b4a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
b4b0: 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
b4c0: 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
b4d0: 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
b4e0: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49     aStat[1] = pI
b4f0: 64 78 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65 6c  dx->aAvgEq[nFiel
b500: 64 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  d-1];.  }..  /* 
b510: 52 65 73 74 6f 72 65 20 74 68 65 20 70 52 65 63  Restore the pRec
b520: 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62  ->nField value b
b530: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
b540: 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69    */.  pRec->nFi
b550: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
b560: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64  return i;.}.#end
b570: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
b580: 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  BLE_STAT4 */../*
b590: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
b5a0: 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20   NULL, pTerm is 
b5b0: 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76  a term that prov
b5c0: 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72  ides an upper or
b5d0: 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20   lower.** bound 
b5e0: 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e  on a range scan.
b5f0: 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65   Without conside
b600: 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69  ring pTerm, it i
b610: 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20  s estimated .** 
b620: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
b630: 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f  ll visit nNew ro
b640: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
b650: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
b660: 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65  mber.** estimate
b670: 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
b680: 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65  after taking pTe
b690: 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  rm into account.
b6a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
b6b0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  er explicitly sp
b6c0: 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69  ecified a likeli
b6d0: 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72  hood() value for
b6e0: 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74   this term,.** t
b6f0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
b700: 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65  alue is the like
b710: 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65  lihood multiplie
b720: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
b730: 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73  of.** input rows
b740: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  . Otherwise, thi
b750: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
b760: 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e  es that an "IS N
b770: 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a  OT NULL" term.**
b780: 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f   has a likelihoo
b790: 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61  d of 0.50, and a
b7a0: 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20  ny other term a 
b7b0: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e  likelihood of 0.
b7c0: 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  25..*/.static Lo
b7d0: 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41  gEst whereRangeA
b7e0: 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20  djust(WhereTerm 
b7f0: 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e  *pTerm, LogEst n
b800: 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e  New){.  LogEst n
b810: 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66  Ret = nNew;.  if
b820: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69  ( pTerm ){.    i
b830: 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
b840: 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
b850: 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nRet += pTerm->t
b860: 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65  ruthProb;.    }e
b870: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
b880: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
b890: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
b8a0: 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20    nRet -= 20;   
b8b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
b8c0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
b8d0: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
b8e0: 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
b8f0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b900: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a  ENABLE_STAT4./*.
b910: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
b920: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
b930: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
b940: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20   index..*/.char 
b950: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
b960: 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74  mnAffinity(sqlit
b970: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
b980: 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Idx, int iCol){.
b990: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
b9a0: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
b9b0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
b9c0: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
b9d0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
b9e0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
b9f0: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
ba00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ba10: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
ba20: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 43  assert( pIdx->zC
ba30: 6f 6c 41 66 66 5b 69 43 6f 6c 5d 21 3d 30 20 29  olAff[iCol]!=0 )
ba40: 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d  ;.  return pIdx-
ba50: 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a  >zColAff[iCol];.
ba60: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
ba70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ba80: 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STAT4./* .** Thi
ba90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
baa0: 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  lled to estimate
bab0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bac0: 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
bad0: 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f  .** range-scan o
bae0: 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e  n a skip-scan in
baf0: 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  dex. For example
bb00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
bb10: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
bb20: 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53  a, b, c);.**   S
bb30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
bb40: 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20  WHERE a=? AND c 
bb50: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b  BETWEEN ? AND ?;
bb60: 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f  .**.** Value pLo
bb70: 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72  op->nOut is curr
bb80: 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
bb90: 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
bba0: 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69  r of rows .** vi
bbb0: 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69  sited for scanni
bbc0: 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29  ng (a=? AND b=?)
bbd0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
bbe0: 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73 74  reduces that est
bbf0: 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d  imate .** by som
bc00: 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f  e factor to acco
bc10: 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20 42  unt for the (c B
bc20: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20  ETWEEN ? AND ?) 
bc30: 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64  expression based
bc40: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34  .** on the stat4
bc50: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e   data for the in
bc60: 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77  dex. this scan w
bc70: 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20  ill be peformed 
bc80: 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
bc90: 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63  es (once for eac
bca0: 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74  h (a,b) combinat
bcb0: 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  ion that matches
bcc0: 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77   a=?) is dealt w
bcd0: 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ith .** by the c
bce0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  aller..**.** It 
bcf0: 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63 61  does this by sca
bd00: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
bd10: 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c  l stat4 samples,
bd20: 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65   comparing value
bd30: 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66  s.** extracted f
bd40: 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  rom pLower and p
bd50: 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20 63  Upper with the c
bd60: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
bd70: 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73  umn in each.** s
bd80: 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20  ample. If L and 
bd90: 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72  U are the number
bda0: 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e   of samples foun
bdb0: 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
bdc0: 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  n or.** equal to
bdd0: 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74 72   the values extr
bde0: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
bdf0: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
be00: 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a  pectively, and.*
be10: 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c  * N is the total
be20: 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
be30: 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e  es, the pLoop->n
be40: 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a  Out value is adj
be50: 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c  usted.** as foll
be60: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75  ows:.**.**   nOu
be70: 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e  t = nOut * ( min
be80: 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29  (U - L, 1) / N )
be90: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72  .**.** If pLower
bea0: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76   is NULL, or a v
beb0: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65  alue cannot be e
bec0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
bed0: 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20  e term, L is.** 
bee0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20  set to zero. If 
bef0: 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pUpper is NULL, 
bf00: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
bf10: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
bf20: 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20  rom it,.** U is 
bf30: 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20  set to N..**.** 
bf40: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66  Normally, this f
bf50: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62  unction sets *pb
bf60: 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65  Done to 1 before
bf70: 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65   returning. Howe
bf80: 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61  ver,.** if no va
bf90: 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61  lue can be extra
bfa0: 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72  cted from either
bfb0: 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65   pLower or pUppe
bfc0: 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a  r (and so the.**
bfd0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
bfe0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
bff0: 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e  delivered remain
c000: 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70  s unchanged), *p
c010: 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74  bDone.** is left
c020: 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   as is..**.** If
c030: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c040: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
c050: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c060: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
c070: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ** SQLITE_OK..*/
c080: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
c090: 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73  eRangeSkipScanEs
c0a0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c0b0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
c0c0: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
c0d0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
c0e0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c0f0: 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
c100: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c110: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
c120: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c130: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c140: 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
c150: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
c160: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
c170: 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
c180: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
c190: 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70  *pLoop,    /* Up
c1a0: 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76  date the .nOut v
c1b0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f  alue of this loo
c1c0: 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f  p */.  int *pbDo
c1d0: 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne          /* S
c1e0: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 74  et to true if at
c1f0: 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e   least one expr.
c200: 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   value extracted
c210: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
c220: 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
c230: 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
c240: 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
c250: 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c  btree.nEq;.  sql
c260: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c270: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f  e->db;.  int nLo
c280: 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  wer = -1;.  int 
c290: 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d  nUpper = p->nSam
c2a0: 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20  ple+1;.  int rc 
c2b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
c2c0: 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49  8 aff = sqlite3I
c2d0: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
c2e0: 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a  ty(db, p, nEq);.
c2f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
c300: 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ;.  .  sqlite3_v
c310: 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20  alue *p1 = 0;   
c320: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c330: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
c340: 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Lower */.  sqlit
c350: 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30  e3_value *p2 = 0
c360: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
c370: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
c380: 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73  om pUpper */.  s
c390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
c3a0: 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  al = 0;        /
c3b0: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
c3c0: 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f  d from record */
c3d0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
c3e0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
c3f0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f  (pParse, p->azCo
c400: 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20  ll[nEq]);.  if( 
c410: 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63  pLower ){.    rc
c420: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56   = sqlite3Stat4V
c430: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
c440: 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78  rse, pLower->pEx
c450: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c  pr->pRight, aff,
c460: 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65   &p1);.    nLowe
c470: 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  r = 0;.  }.  if(
c480: 20 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53   pUpper && rc==S
c490: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c4a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
c4b0: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
c4c0: 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70  Parse, pUpper->p
c4d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
c4e0: 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70  f, &p2);.    nUp
c4f0: 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70  per = p2 ? 0 : p
c500: 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a  ->nSample;.  }..
c510: 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29    if( p1 || p2 )
c520: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
c530: 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20   int nDiff;.    
c540: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
c550: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e  ITE_OK && i<p->n
c560: 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
c570: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c580: 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20  Stat4Column(db, 
c590: 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  p->aSample[i].p,
c5a0: 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e   p->aSample[i].n
c5b0: 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20  , nEq, &pVal);. 
c5c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c5d0: 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a  ITE_OK && p1 ){.
c5e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
c5f0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
c600: 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43  are(p1, pVal, pC
c610: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
c620: 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65  ( res>=0 ) nLowe
c630: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
c640: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c650: 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20  E_OK && p2 ){.  
c660: 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
c670: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
c680: 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c  e(p2, pVal, pCol
c690: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
c6a0: 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b  res>=0 ) nUpper+
c6b0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
c6c0: 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55  .    nDiff = (nU
c6d0: 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a  pper - nLower);.
c6e0: 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30      if( nDiff<=0
c6f0: 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20   ) nDiff = 1;.. 
c700: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
c710: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
c720: 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  and lower bound 
c730: 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74  specified, and t
c740: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he .    ** compa
c750: 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20  risons indicate 
c760: 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6c  that they are cl
c770: 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73  ose together, us
c780: 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20  e the fallback. 
c790: 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73     ** method (as
c7a0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 63  sume that the sc
c7b0: 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f  an visits 1/64 o
c7c0: 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20  f the rows) for 
c7d0: 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a  estimating.    *
c7e0: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
c7f0: 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74  rows visited. Ot
c800: 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74  herwise, estimat
c810: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
c820: 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e  rows.    ** usin
c830: 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  g the method des
c840: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 68 65  cribed in the he
c850: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72  ader comment for
c860: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
c870: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  */.    if( nDiff
c880: 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30  !=1 || pUpper==0
c890: 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b   || pLower==0 ){
c8a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75  .      int nAdju
c8b0: 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67  st = (sqlite3Log
c8c0: 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20  Est(p->nSample) 
c8d0: 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  - sqlite3LogEst(
c8e0: 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70  nDiff));.      p
c8f0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41  Loop->nOut -= nA
c900: 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62  djust;.      *pb
c910: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
c920: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
c930: 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63   ("range skip-sc
c940: 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
c950: 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73  %u  adjust=%d es
c960: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70      nLower, nUpp
c990: 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20  er, nAdjust*-1, 
c9a0: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20  pLoop->nOut));. 
c9b0: 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
c9c0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f     assert( *pbDo
c9d0: 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  ne==0 );.  }..  
c9e0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
c9f0: 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p1);.  sqlite3V
ca00: 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20  alueFree(p2);.  
ca10: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
ca20: 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
ca30: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
ca40: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
ca50: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
ca60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ca70: 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
ca80: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ca90: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
caa0: 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
cab0: 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
cac0: 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
cad0: 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
cae0: 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
caf0: 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
cb00: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
cb10: 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
cb20: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
cb30: 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
cb40: 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
cb50: 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
cb60: 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
cb70: 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
cb80: 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
cb90: 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
cba0: 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
cbb0: 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
cbc0: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
cbd0: 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
cbe0: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
cc00: 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
cc10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
cc20: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
cc30: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
cc50: 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
cc60: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
cc70: 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
cc80: 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
cc90: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
cca0: 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
ccb0: 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
ccc0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
ccd0: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
cce0: 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42  The value in (pB
ccf0: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
cd00: 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68  btree.nEq) is th
cd10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
cd20: 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
cd30: 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
cd40: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
cd50: 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
cd60: 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
cd70: 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
cd80: 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
cd90: 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
cda0: 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
cdb0: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
cdc0: 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
cdd0: 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
cde0: 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
cdf0: 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
ce00: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
ce10: 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
ce20: 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
ce30: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
ce40: 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
ce50: 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
ce60: 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
ce70: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
ce80: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
ce90: 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
cea0: 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
ceb0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
cec0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
ced0: 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
cee0: 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
cef0: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
cf00: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
cf10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
cf20: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
cf30: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
cf40: 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
cf50: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
cf60: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
cf70: 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
cf80: 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
cf90: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
cfa0: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
cfb0: 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
cfc0: 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74  s 0, then *pnOut
cfd0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cfe0: 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
cff0: 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
d000: 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
d010: 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
d020: 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
d030: 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
d040: 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  r the range cons
d050: 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61  traints pLower a
d060: 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a  nd pUpper..** .*
d070: 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
d080: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34   of sqlite_stat4
d090: 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f   ANALYZE data, o
d0a0: 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63  r if such data c
d0b0: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
d0c0: 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65  , a single range
d0d0: 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
d0e0: 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
d0f0: 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
d100: 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61   of 4. .** and a
d110: 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61   pair of constra
d120: 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c  ints (x>? AND x<
d130: 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65  ?) reduces the e
d140: 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
d150: 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65  f.** rows visite
d160: 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  d by a factor of
d170: 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   64..*/.static i
d180: 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
d190: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
d1a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
d1b0: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
d1c0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
d1d0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
d1e0: 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
d1f0: 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  r,.  WhereTerm *
d200: 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
d210: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
d220: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
d230: 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
d240: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
d250: 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
d260: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
d270: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
d280: 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
d290: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
d2a0: 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d   *pLoop     /* M
d2b0: 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20  odify the .nOut 
d2c0: 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20  and maybe .rRun 
d2d0: 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69  fields */.){.  i
d2e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d2f0: 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  K;.  int nOut = 
d300: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c  pLoop->nOut;.  L
d310: 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66  ogEst nNew;..#if
d320: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d330: 45 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  E_STAT4.  Index 
d340: 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
d350: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
d360: 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
d370: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
d380: 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  f( p->nSample>0 
d390: 26 26 20 41 4c 57 41 59 53 28 6e 45 71 3c 70 2d  && ALWAYS(nEq<p-
d3a0: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 29 0a 20 20 20  >nSampleCol).   
d3b0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
d3c0: 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
d3d0: 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 34 29  b, SQLITE_Stat4)
d3e0: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  .  ){.    if( nE
d3f0: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
d400: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
d410: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
d420: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
d430: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
d440: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
d450: 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f   int nBtm = pLoo
d460: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b  p->u.btree.nBtm;
d470: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 70 20  .      int nTop 
d480: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
d490: 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a  .nTop;..      /*
d4a0: 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
d4b0: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
d4c0: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d4d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d4e0: 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ws in .      ** 
d4f0: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
d500: 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
d510: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
d520: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
d530: 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   The.      ** lo
d540: 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
d550: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
d560: 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
d570: 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
d580: 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65        ** key-pre
d590: 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
d5a0: 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
d5b0: 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
d5c0: 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
d5d0: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
d5e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
d5f0: 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
d600: 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
d610: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
d620: 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20  r, if pLower is 
d630: 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f  NULL or $L canno
d640: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
d650: 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20  rom it (because 
d660: 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  it.      ** is n
d670: 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
d680: 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
d690: 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
d6a0: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
d6b0: 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73       ** range is
d6c0: 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
d6d0: 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
d6e0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
d6f0: 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20  orks, even.     
d700: 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
d710: 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
d720: 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
d730: 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
d740: 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24  and .      ** ($
d750: 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
d760: 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
d770: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
d780: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
d790: 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c  *.      ** Simil
d7a0: 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20  arly, iUpper is 
d7b0: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
d7c0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
d7d0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
d7e0: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
d7f0: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
d800: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
d810: 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65  query. Where the
d820: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20   upper bound.   
d830: 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
d840: 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e  ($P) or ($P:$U).
d850: 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20   Again, even if 
d860: 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $U is available,
d870: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20   both values.   
d880: 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
d890: 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
d8a0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
d8b0: 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
d8c0: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
d8d0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d        ** The num
d8e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77  ber of rows betw
d8f0: 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e  een the two boun
d900: 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20  ds is then just 
d910: 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20  iUpper-iLower.. 
d920: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52       */.      tR
d930: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20  owcnt iLower;   
d940: 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74    /* Rows less t
d950: 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
d960: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f  und */.      tRo
d970: 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20  wcnt iUpper;    
d980: 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68   /* Rows less th
d990: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
d9a0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
d9b0: 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20  iLwrIdx = -2;   
d9c0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
d9d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
d9e0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55   */.      int iU
d9f0: 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a  prIdx = -1;   /*
da00: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
da10: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
da20: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  /..      if( pRe
da30: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  c ){.        tes
da40: 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69  tcase( pRec->nFi
da50: 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e  eld!=pBuilder->n
da60: 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  RecValid );.    
da70: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
da80: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
da90: 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a  cValid;.      }.
daa0: 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
dab0: 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
dac0: 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
dad0: 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
dae0: 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
daf0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
db00: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
db10: 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
db20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
db30: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
db40: 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
db50: 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
db60: 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
db70: 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
db80: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
db90: 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
dba0: 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
dbb0: 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
dbc0: 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
dbd0: 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
dbe0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
dbf0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
dc00: 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
dc10: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
dc20: 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
dc30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
dc40: 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
dc50: 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
dc60: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
dc70: 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
dc80: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
dc90: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
dca0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
dcb0: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
dcc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dcd0: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
dce0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
dcf0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
dd00: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
dd10: 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
dd20: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
dd30: 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
dd40: 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
dd50: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
dd60: 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
dd70: 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Upper);.        
dd80: 53 57 41 50 28 69 6e 74 2c 20 6e 42 74 6d 2c 20  SWAP(int, nBtm, 
dd90: 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  nTop);.      }..
dda0: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
ddb0: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
ddc0: 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69   the iLower esti
ddd0: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
dde0: 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  L). */.      if(
ddf0: 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
de00: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de20: 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  Values extracted
de30: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
de40: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
de50: 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
de60: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
de70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de80: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
de90: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
dea0: 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 42 74 6d  Rec, pExpr, nBtm
deb0: 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20  , nEq, &n);.    
dec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ded0: 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20  TE_OK && n ){.  
dee0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
def0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
df00: 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54  u16 mask = WO_GT
df10: 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  |WO_LE;.        
df20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
df30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
df40: 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57  r)>n ) mask = (W
df50: 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20  O_LE|WO_LT);.   
df60: 20 20 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d         iLwrIdx =
df70: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
df80: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
df90: 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  0, a);.         
dfa0: 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
dfb0: 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
dfc0: 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31  or & mask) ? a[1
dfd0: 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
dfe0: 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
dff0: 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
e000: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
e010: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
e020: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
e030: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e040: 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
e050: 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
e060: 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
e070: 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
e080: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
e090: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
e0a0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
e0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
e0c0: 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66  lues extracted f
e0d0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
e0e0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
e0f0: 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
e100: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
e110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
e120: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
e130: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
e140: 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f 70 2c 20  c, pExpr, nTop, 
e150: 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  nEq, &n);.      
e160: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e170: 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20  _OK && n ){.    
e180: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
e190: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31  ew;.          u1
e1a0: 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57  6 mask = WO_GT|W
e1b0: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20  O_LE;.          
e1c0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 56  if( sqlite3ExprV
e1d0: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
e1e0: 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f  >n ) mask = (WO_
e1f0: 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20  LE|WO_LT);.     
e200: 20 20 20 20 20 69 55 70 72 49 64 78 20 3d 20 77       iUprIdx = w
e210: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e220: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c  rse, p, pRec, 1,
e230: 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
e240: 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
e250: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
e260: 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20   & mask) ? a[1] 
e270: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
e280: 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20  if( iNew<iUpper 
e290: 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b  ) iUpper = iNew;
e2a0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
e2b0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70  -;.          pUp
e2c0: 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  per = 0;.       
e2d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
e2e0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
e2f0: 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69   = pRec;.      i
e300: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e310: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e320: 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
e330: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
e340: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
e350: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
e360: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
e370: 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20  UNING:  If both 
e380: 69 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65  iUpper and iLowe
e390: 72 20 61 72 65 20 64 65 72 69 76 65 64 20 66 72  r are derived fr
e3a0: 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  om the same.    
e3b0: 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c        ** sample,
e3c0: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65   then assume the
e3d0: 79 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65  y are 4x more se
e3e0: 6c 65 63 74 69 76 65 2e 20 20 54 68 69 73 20 62  lective.  This b
e3f0: 72 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  rings.          
e400: 2a 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ** the estimated
e410: 20 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72   selectivity mor
e420: 65 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77  e in line with w
e430: 68 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  hat it would be.
e440: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
e450: 65 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75  estimated withou
e460: 74 20 74 68 65 20 75 73 65 20 6f 66 20 53 54 41  t the use of STA
e470: 54 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  T4 tables. */.  
e480: 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72          if( iLwr
e490: 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e  Idx==iUprIdx ) n
e4a0: 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65  New -= 20;  asse
e4b0: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
e4c0: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
e4d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e4e0: 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
e4f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
e500: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
e510: 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
e520: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
e530: 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
e540: 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
e550: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e560: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
e570: 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
e580: 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
e590: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
e5c0: 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
e5d0: 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
e5e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e5f0: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
e600: 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
e610: 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
e620: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
e630: 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
e640: 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
e650: 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
e660: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
e670: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
e680: 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
e690: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
e6a0: 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
e6b0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
e6c0: 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
e6d0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
e6e0: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
e6f0: 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
e700: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
e710: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
e720: 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
e730: 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
e740: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
e750: 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
e760: 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
e770: 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
e780: 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
e790: 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e  ower limit and n
e7a0: 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a  either limit.  *
e7b0: 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61  * has an applica
e7c0: 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b  tion-defined lik
e7d0: 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d  elihood(), assum
e7e0: 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
e7f0: 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
e800: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
e810: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
e820: 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
e830: 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
e840: 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
e850: 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
e860: 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
e870: 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
e880: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
e890: 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
e8a0: 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
e8b0: 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
e8c0: 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
e8d0: 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
e8e0: 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
e8f0: 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
e900: 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72  er && pLower->tr
e910: 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70  uthProb>0 && pUp
e920: 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74  per && pUpper->t
e930: 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20  ruthProb>0 ){.  
e940: 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20    nNew -= 20;.  
e950: 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c  }..  nOut -= (pL
e960: 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70  ower!=0) + (pUpp
e970: 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e  er!=0);.  if( nN
e980: 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
e990: 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
e9a0: 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
e9b0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
e9c0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
e9d0: 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  ).  if( pLoop->n
e9e0: 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  Out>nOut ){.    
e9f0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
ea00: 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77  ("Range scan low
ea10: 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64  ers nOut from %d
ea20: 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ea40: 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74  Loop->nOut, nOut
ea50: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
ea60: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
ea70: 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
ea80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
ea90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
eaa0: 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT4./*.** Es
eab0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
eac0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
ead0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
eae0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
eaf0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
eb00: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
eb10: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
eb20: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
eb30: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
eb40: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
eb50: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
eb60: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
eb70: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
eb80: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 34  and sqlite_stat4
eb90: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
eba0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
ebb0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
ebc0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
ebd0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
ebe0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
ebf0: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
ec00: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
ec10: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
ec20: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
ec30: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
ec40: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
ec50: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
ec60: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
ec70: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
ec80: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
ec90: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
eca0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
ecb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ecc0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
ecd0: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
ece0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
ecf0: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
ed00: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
ed10: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
ed20: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
ed30: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
ed40: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
ed50: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
ed60: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
ed70: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
ed80: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
ed90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
eda0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
edb0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
edc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
edd0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
ede0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
edf0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
ee00: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
ee10: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
ee20: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
ee30: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
ee40: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
ee50: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
ee60: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
ee70: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
ee80: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
ee90: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
eea0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
eeb0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
eec0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
eed0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
eee0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
eef0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
ef00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
ef10: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
ef20: 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRec;.  int rc;
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
ef50: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
ef60: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ef80: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
ef90: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
efa0: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
efb0: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
efc0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
efd0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
efe0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
eff0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
f000: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
f010: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
f020: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
f030: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
f040: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
f050: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
f060: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
f070: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
f080: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
f090: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
f0a0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
f0b0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
f0c0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
f0d0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
f0e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
f0f0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
f100: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
f110: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
f120: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f130: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
f140: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
f150: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
f160: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
f170: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
f180: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
f190: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
f1a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f1b0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
f1c0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
f1d0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
f1e0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
f1f0: 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  1, nEq-1, &bOk);
f200: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
f210: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
f220: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
f240: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
f250: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
f260: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
f270: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
f280: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
f290: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
f2a0: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
f2b0: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
f2c0: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
f2d0: 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c  s %s(%d): %d\n",
f2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2f0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45      p->zName, nE
f300: 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  q-1, (int)a[1]))
f310: 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31  ;.  *pnRow = a[1
f320: 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  ];.  .  return r
f330: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
f340: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f350: 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  T4 */..#ifdef SQ
f360: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
f370: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
f380: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f390: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
f3a0: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
f3b0: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
f3c0: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
f3d0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
f3e0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
f3f0: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
f400: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
f410: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
f420: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
f430: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
f440: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
f450: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
f460: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
f470: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
f480: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
f490: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
f4a0: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
f4b0: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
f4c0: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
f4d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f4e0: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
f4f0: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
f500: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
f510: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
f520: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
f530: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
f540: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
f550: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
f560: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
f570: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
f580: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
f590: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
f5a0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
f5b0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
f5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
f5d0: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
f5e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f5f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
f600: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
f610: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
f620: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
f630: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
f640: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
f650: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
f660: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
f670: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
f680: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
f690: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
f6a0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
f6b0: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
f6c0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
f6d0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
f6e0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
f6f0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
f700: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
f710: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
f720: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
f730: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
f740: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
f750: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
f760: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f770: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
f780: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f790: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f7b0: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
f7c0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
f7d0: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
f7e0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
f7f0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
f800: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
f810: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f830: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f840: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
f850: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
f860: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f870: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
f880: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f890: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
f8a0: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
f8b0: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
f8c0: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
f8d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
f8e0: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
f8f0: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
f900: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f910: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
f920: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f930: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f940: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
f950: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
f960: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
f970: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
f980: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f990: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
f9a0: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
f9b0: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
f9c0: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
f9d0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
f9e0: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
f9f0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
fa00: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
fa10: 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66  E_STAT4 */...#if
fa20: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
fa30: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
fa40: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
fa50: 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
fa60: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
fa70: 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
fa80: 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
fa90: 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
faa0: 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
fab0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
fac0: 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
fad0: 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
fae0: 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
faf0: 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
fb00: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74  ;.    char zLeft
fb10: 5b 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [50];.    memcpy
fb20: 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
fb30: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
fb40: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
fb50: 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
fb60: 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69  [0] = 'V';.    i
fb70: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
fb80: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
fb90: 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
fba0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
fbb0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
fbc0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
fbd0: 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20  oin) ) zType[2] 
fbe0: 3d 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'L';.    if( p
fbf0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fc00: 26 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20  & WO_SINGLE ){. 
fc10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
fc20: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
fc30: 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d  ft),zLeft,"left=
fc40: 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
fc70: 6f 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  or, pTerm->u.lef
fc80: 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65  tColumn);.    }e
fc90: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
fca0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
fcb0: 52 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e  R)!=0 && pTerm->
fcc0: 75 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a  u.pOrInfo!=0 ){.
fcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
fce0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
fcf0: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65  eft),zLeft,"inde
fd00: 78 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a  xable=0x%lld", .
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e         pTerm->u.
fd30: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
fd40: 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
fd50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
fd60: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
fd70: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74  eft),zLeft,"left
fd80: 3d 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66  =%d", pTerm->lef
fd90: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  tCursor);.    }.
fda0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
fdb0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
fdc0: 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20  TERM-%-3d %p %s 
fdd0: 25 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20  %-12s prob=%-3d 
fde0: 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67  op=0x%03x wtFlag
fdf0: 73 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20  s=0x%04x",.     
fe00: 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
fe10: 7a 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54  zType, zLeft, pT
fe20: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
fe30: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
fe40: 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
fe50: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  wtFlags);.    if
fe60: 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20  ( pTerm->iField 
fe70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fe80: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46  DebugPrintf(" iF
fe90: 69 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72  ield=%d\n", pTer
fea0: 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  m->iField);.    
feb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
fec0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fed0: 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
fee0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
fef0: 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70  Expr(0, pTerm->p
ff00: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  Expr, 0);.  }.}.
ff10: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
ff20: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
ff30: 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65  D./*.** Show the
ff40: 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
ff50: 74 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75  t of a WhereClau
ff60: 73 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  se.*/.void sqlit
ff70: 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
ff80: 6e 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  nt(WhereClause *
ff90: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
ffa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d   for(i=0; i<pWC-
ffb0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
ffc0: 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
ffd0: 28 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  (&pWC->a[i], i);
ffe0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
fff0: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
10000 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
10010 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
10020 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
10030 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
10040 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10050 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
10060 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
10070 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
10080 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
10090 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
100a0 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
100b0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
100c0 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74  >nSrc+3)/4;.  st
100d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
100e0 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  m *pItem = pWInf
100f0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
10100 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
10110 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
10120 3e 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b  >pTab;.  Bitmask
10130 20 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61   mAll = (((Bitma
10140 73 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d  sk)1)<<(nb*4)) -
10150 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62   1;.  sqlite3Deb
10160 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
10170 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
10180 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
101a0 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
101b0 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
101c0 65 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20  ereq & mAll);.  
101d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
101e0 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
10210 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
10220 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10230 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
10240 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
10250 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
10260 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
10270 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  me;.    if( p->u
10280 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26  .btree.pIndex &&
10290 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   (zName = p->u.b
102a0 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
102b0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
102c0 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
102d0 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
102e0 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
102f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
10300 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
10310 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
10320 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
10330 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
10340 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
10350 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
10360 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
10370 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
10380 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
10390 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
103a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
103b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
103c0 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
103d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
103e0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
103f0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
10400 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
10410 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10420 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
10430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10440 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
10450 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
10460 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
10470 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
10480 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
10490 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
104a0 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
104b0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
104c0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
104d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
104e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
104f0 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
10500 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
10510 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73  .  }.  if( p->ws
10520 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
10530 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71  IPSCAN ){.    sq
10540 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10550 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22  (" f %05x %d-%d"
10560 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
10570 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70  >nLTerm,p->nSkip
10580 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10590 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
105a0 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64  tf(" f %05x N %d
105b0 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
105c0 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20  ->nLTerm);.  }. 
105d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
105e0 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64  ntf(" cost %d,%d
105f0 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75  ,%d\n", p->rSetu
10600 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
10610 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  Out);.  if( p->n
10620 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
10630 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
10640 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  100)!=0 ){.    i
10650 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10660 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20  0; i<p->nLTerm; 
10670 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
10680 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c  eTermPrint(p->aL
10690 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  Term[i], i);.   
106a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
106b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
106c0 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
106d0 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
106e0 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
106f0 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
10700 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
10710 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
10720 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
10730 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
10740 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
10750 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
10760 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
10770 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
10780 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
10790 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
107a0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
107b0 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
107c0 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
107d0 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
107e0 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
107f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10800 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
10810 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
10820 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
10830 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
10840 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
10850 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
10860 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
10870 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
10880 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
10890 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
108a0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
108b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
108c0 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
108d0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
108e0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
108f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
10900 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
10910 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10920 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
10930 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10940 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
10950 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
10960 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10970 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
10980 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
10990 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
109a0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
109b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
109c0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
109d0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
109e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
109f0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
10a00 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
10a10 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
10a20 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
10a30 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
10a40 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
10a50 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
10a60 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
10a70 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
10a80 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
10a90 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  eNN(db, p->aLTer
10aa0 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
10ab0 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
10ac0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
10ad0 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
10ae0 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
10af0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
10b00 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
10b10 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
10b20 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
10b30 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
10b40 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10b50 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
10b60 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
10b70 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
10b80 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
10b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ba0 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
10bb0 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
10bc0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
10bd0 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
10be0 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
10bf0 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
10c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10c10 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
10c20 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
10c30 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
10c40 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
10c50 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
10c60 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
10c70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
10c80 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54  reeNN(db, p->aLT
10c90 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
10ca0 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
10cb0 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
10cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
10ce0 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
10cf0 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
10d00 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
10d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
10d20 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
10d30 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
10d40 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
10d50 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68  op *pFrom){.  wh
10d60 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
10d70 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66  n(db, pTo);.  if
10d80 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
10d90 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
10da0 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20  ->nLTerm) ){.   
10db0 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c   memset(&pTo->u,
10dc0 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e   0, sizeof(pTo->
10dd0 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  u));.    return 
10de0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10df0 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  T;.  }.  memcpy(
10e00 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
10e10 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
10e20 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
10e30 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
10e40 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
10e50 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
10e60 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
10e70 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
10e80 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
10e90 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
10ea0 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
10eb0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
10ec0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
10ed0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
10ee0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
10ef0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
10f00 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
10f10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10f20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
10f30 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
10f40 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
10f50 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
10f60 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
10f70 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10f80 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
10f90 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
10fa0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
10fb0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
10fc0 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
10fd0 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
10fe0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
10ff0 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
11000 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
11010 57 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  WInfo){.  int i;
11020 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
11030 6f 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  o!=0 );.  for(i=
11040 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
11050 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57  vel; i++){.    W
11060 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
11070 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
11080 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  ];.    if( pLeve
11090 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c  l->pWLoop && (pL
110a0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
110b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
110c0 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20  _ABLE) ){.      
110d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
110e0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
110f0 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
11100 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72   }.  sqlite3Wher
11110 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
11120 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 77 68  Info->sWC);.  wh
11130 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
11140 6f 70 73 20 29 7b 0a 20 20 20 20 57 68 65 72 65  ops ){.    Where
11150 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
11160 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 70 57  ->pLoops;.    pW
11170 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
11180 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
11190 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
111a0 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 73  (db, p);.  }.  s
111b0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
111c0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  b, pWInfo);.}../
111d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
111e0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
111f0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
11200 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
11210 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  X has the same o
11220 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
11230 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20  t Y.**   (2)  X 
11240 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52 45  uses fewer WHERE
11250 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
11260 61 6e 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 45  an Y.**   (3)  E
11270 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
11280 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
11290 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 62 79   is also used by
112a0 20 59 0a 2a 2a 20 20 20 28 34 29 20 20 58 20 73   Y.**   (4)  X s
112b0 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73  kips at least as
112c0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73   many columns as
112d0 20 59 0a 2a 2a 20 20 20 28 35 29 20 20 49 66 20   Y.**   (5)  If 
112e0 58 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  X is a covering 
112f0 69 6e 64 65 78 2c 20 74 68 61 6e 20 59 20 69 73  index, than Y is
11300 20 74 6f 6f 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69   too.**.** Condi
11310 74 69 6f 6e 73 20 28 32 29 20 61 6e 64 20 28 33  tions (2) and (3
11320 29 20 6d 65 61 6e 20 74 68 61 74 20 58 20 69 73  ) mean that X is
11330 20 61 20 22 70 72 6f 70 65 72 20 73 75 62 73 65   a "proper subse
11340 74 22 20 6f 66 20 59 2e 0a 2a 2a 20 49 66 20 58  t" of Y..** If X
11350 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
11360 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20  set of Y then Y 
11370 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69  is a better choi
11380 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20  ce and ought.** 
11390 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20  to have a lower 
113a0 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74  cost.  This rout
113b0 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45  ine returns TRUE
113c0 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20   when that cost 
113d0 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  .** relationship
113e0 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64   is inverted and
113f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a   needs to be adj
11400 75 73 74 65 64 2e 20 20 43 6f 6e 73 74 72 61 69  usted.  Constrai
11410 6e 74 20 28 34 29 0a 2a 2a 20 77 61 73 20 61 64  nt (4).** was ad
11420 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58  ded because if X
11430 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20   uses skip-scan 
11440 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73  less than Y it s
11450 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65  till might.** de
11460 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f  serve a lower co
11470 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  st even if it is
11480 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
11490 20 6f 66 20 59 2e 20 20 43 6f 6e 73 74 72 61 69   of Y.  Constrai
114a0 6e 74 20 28 35 29 0a 2a 2a 20 77 61 73 20 61 64  nt (5).** was ad
114b0 64 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f  ded because a co
114c0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 70 72 6f  vering index pro
114d0 62 61 62 6c 79 20 64 65 73 65 72 76 65 73 20 74  bably deserves t
114e0 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
114f0 6f 73 74 0a 2a 2a 20 74 68 61 6e 20 61 20 6e 6f  ost.** than a no
11500 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
11510 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61   even if it is a
11520 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
11530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11540 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
11550 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f  operSubset(.  co
11560 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
11570 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  X,       /* Firs
11580 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63  t WhereLoop to c
11590 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
115a0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20  t WhereLoop *pY 
115b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
115c0 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57  e against this W
115d0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  hereLoop */.){. 
115e0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
115f0 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e   pX->nLTerm-pX->
11600 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54  nSkip >= pY->nLT
11610 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b  erm-pY->nSkip ){
11620 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
11630 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62  * X is not a sub
11640 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a  set of Y */.  }.
11650 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20    if( pY->nSkip 
11660 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65  > pX->nSkip ) re
11670 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58  turn 0;.  if( pX
11680 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52  ->rRun >= pY->rR
11690 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58  un ){.    if( pX
116a0 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75  ->rRun > pY->rRu
116b0 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
116c0 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
116d0 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69   than Y */.    i
116e0 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59  f( pX->nOut > pY
116f0 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20  ->nOut ) return 
11700 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
11710 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
11720 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e    }.  for(i=pX->
11730 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  nLTerm-1; i>=0; 
11740 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58  i--){.    if( pX
11750 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
11760 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
11770 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d  or(j=pY->nLTerm-
11780 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
11790 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54       if( pY->aLT
117a0 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65  erm[j]==pX->aLTe
117b0 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  rm[i] ) break;. 
117c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
117d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
117e0 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20   X not a subset 
117f0 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20  of Y since term 
11800 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79  X[i] not used by
11810 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20   Y */.  }.  if( 
11820 28 70 58 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pX->wsFlags&WHE
11830 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
11840 0a 20 20 20 26 26 20 28 70 59 2d 3e 77 73 46 6c  .   && (pY->wsFl
11850 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ags&WHERE_IDX_ON
11860 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  LY)==0 ){.    re
11870 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 6e 73  turn 0;  /* Cons
11880 74 72 61 69 6e 74 20 28 35 29 20 2a 2f 0a 20 20  traint (5) */.  
11890 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
118a0 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
118b0 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
118c0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
118d0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
118e0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
118f0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
11900 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
11910 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
11920 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
11930 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
11940 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
11950 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
11960 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
11970 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
11980 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
11990 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
119a0 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
119b0 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
119c0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
119d0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
119e0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
119f0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
11a00 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
11a10 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
11a20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
11a30 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
11a40 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
11a50 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
11a60 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
11a70 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
11a80 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
11a90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
11aa0 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
11ab0 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
11ac0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
11ad0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
11ae0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
11af0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
11b00 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
11b10 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
11b20 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
11b30 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
11b40 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
11b50 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
11b60 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
11b70 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
11b80 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
11b90 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
11ba0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
11bb0 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
11bc0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
11bd0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
11be0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
11bf0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
11c00 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
11c10 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
11c20 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
11c30 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
11c40 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
11c50 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
11c60 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
11c90 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
11ca0 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
11cb0 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
11cc0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
11cd0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
11ce0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
11cf0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
11d00 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
11d10 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
11d20 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
11d30 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
11d40 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
11d50 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
11d60 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
11d70 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
11d80 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
11d90 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
11da0 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
11db0 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
11dc0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
11dd0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
11de0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
11df0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11e00 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
11e10 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
11e20 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
11e30 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
11e40 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
11e50 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
11e60 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
11e70 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
11e80 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
11e90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
11ea0 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
11eb0 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
11ec0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
11ed0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
11ee0 0a 2a 2a 20 72 65 70 6c 61 63 65 64 20 62 79 20  .** replaced by 
11ef0 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
11f00 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
11f10 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e  pTemplate does n
11f20 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65  ot belong on the
11f30 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 2e   WhereLoop list.
11f40 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
11f50 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
11f60 6f 75 67 68 74 20 74 6f 20 62 65 20 64 72 6f 70  ought to be drop
11f70 70 65 64 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ped from further
11f80 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0a   consideration..
11f90 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
11fa0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
11fb0 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 72 65  pTemplate can re
11fc0 70 6c 61 63 65 2c 20 74 68 65 6e 20 72 65 74 75  place, then retu
11fd0 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74  rn the.** link t
11fe0 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58  hat points to pX
11ff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70  ..**.** If pTemp
12000 6c 61 74 65 20 63 61 6e 6e 6f 74 20 72 65 70 6c  late cannot repl
12010 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
12020 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
12030 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
12040 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
12050 20 74 68 65 20 6c 69 73 74 20 61 73 20 61 20 6e   the list as a n
12060 65 77 20 65 6e 74 72 79 2c 20 74 68 65 6e 20 72  ew entry, then r
12070 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
12080 74 6f 20 74 68 65 0a 2a 2a 20 74 61 69 6c 20 6f  to the.** tail o
12090 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
120a0 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
120b0 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
120c0 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
120d0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
120e0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
120f0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
12100 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
12110 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
12120 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
12130 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
12140 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
12150 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
12160 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
12170 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
12180 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
12190 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
121a0 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
121b0 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
121c0 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
121d0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
121e0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
121f0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
12200 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
12210 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
12220 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
12230 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
12240 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
12250 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
12260 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
12270 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
12280 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
12290 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
122a0 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
122b0 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
122c0 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
122d0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
122e0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
122f0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
12300 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
12310 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
12320 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
12330 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
12340 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
12350 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12370 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
12380 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
12390 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
123a0 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
123b0 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
123c0 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
123d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
123e0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
123f0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
12400 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
12410 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
12420 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
12430 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
12440 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
12450 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
12460 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
12470 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
12480 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
12490 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
124a0 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
124b0 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
124c0 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
124d0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
124e0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
124f0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
12500 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
12510 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
12520 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
12530 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
12540 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
12550 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
12560 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
12570 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
12580 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
12590 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
125a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
125b0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
125c0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
125d0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
125e0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
125f0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
12600 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12610 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12620 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12630 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
12640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
12650 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
12660 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
12670 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
12680 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
12690 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
126a0 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
126b0 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
126c0 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
126d0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
126e0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
126f0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
12700 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
12710 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
12720 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
12730 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
12740 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
12750 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
12760 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
12770 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
12780 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
12790 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
127a0 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
127b0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
127c0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
127d0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
127e0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
127f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
12800 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
12810 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
12820 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
12830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
12840 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
12850 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
12860 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
12870 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
12880 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
12890 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
128a0 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
128b0 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
128c0 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
128d0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
128e0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
128f0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
12900 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
12910 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
12920 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
12930 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
12940 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
12950 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
12960 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
12970 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
12980 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
12990 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
129a0 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
129b0 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
129c0 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
129d0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
129e0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
12a10 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
12a20 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
12a50 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
12a60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
12a70 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
12a80 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
12a90 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
12aa0 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
12ab0 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
12ac0 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
12ad0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
12ae0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
12af0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
12b00 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
12b10 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
12b20 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
12b30 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
12b40 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
12b50 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
12b60 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
12b70 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
12b80 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
12b90 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
12ba0 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
12bb0 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
12bc0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
12bd0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
12be0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
12bf0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
12c00 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
12c10 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
12c20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
12c30 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
12c40 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
12c50 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
12c60 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
12c70 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
12c80 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
12c90 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
12ca0 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
12cb0 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
12cc0 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
12cd0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
12ce0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
12cf0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
12d00 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
12d10 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
12d20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
12d30 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
12d40 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
12d50 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
12d60 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
12d70 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
12d80 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
12d90 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
12da0 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
12db0 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
12dc0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12dd0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
12de0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
12df0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
12e00 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
12e10 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
12e20 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
12e30 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
12e40 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
12e50 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
12e60 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
12e70 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
12e80 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
12e90 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
12ea0 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
12eb0 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
12ec0 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
12ed0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
12ee0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
12ef0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
12f00 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
12f10 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
12f20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
12f30 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
12f40 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
12f50 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12f60 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
12f70 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
12f80 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
12f90 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
12fa0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
12fb0 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
12fc0 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
12fd0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
12fe0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
12ff0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
13000 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
13010 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
13020 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 74 6f 70  t rc;..  /* Stop
13030 20 74 68 65 20 73 65 61 72 63 68 20 6f 6e 63 65   the search once
13040 20 77 65 20 68 69 74 20 74 68 65 20 71 75 65 72   we hit the quer
13050 79 20 70 6c 61 6e 6e 65 72 20 73 65 61 72 63 68  y planner search
13060 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 69 66 28 20   limit */.  if( 
13070 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c  pBuilder->iPlanL
13080 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 57  imit==0 ){.    W
13090 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
130a0 66 66 66 66 2c 28 22 3d 3d 3d 20 71 75 65 72 79  ffff,("=== query
130b0 20 70 6c 61 6e 6e 65 72 20 73 65 61 72 63 68 20   planner search 
130c0 6c 69 6d 69 74 20 72 65 61 63 68 65 64 20 3d 3d  limit reached ==
130d0 3d 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20  =\n"));.    if( 
130e0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
130f0 20 29 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   ) pBuilder->pOr
13100 53 65 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  Set->n = 0;.    
13110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
13120 4e 45 3b 0a 20 20 7d 0a 20 20 70 42 75 69 6c 64  NE;.  }.  pBuild
13130 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 2d 2d  er->iPlanLimit--
13140 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
13150 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
13160 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
13170 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
13180 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
13190 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
131a0 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
131b0 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20  >pOrSet!=0 ){.  
131c0 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d    if( pTemplate-
131d0 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57  >nLTerm ){.#if W
131e0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
131f0 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20  D.      u16 n = 
13200 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
13210 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  ->n;.      int x
13220 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   =.#endif.      
13230 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
13240 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
13250 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
13260 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
13270 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
132a0 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
132b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
132c0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
132d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
132e0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
132f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
13300 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
13310 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
13320 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
13330 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
13340 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
13350 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
13360 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13370 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
13380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13390 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
133a0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
133b0 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
133c0 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
133d0 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
133e0 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
133f0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
13400 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
13410 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
13420 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
13430 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
13440 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
13450 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
13460 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
13470 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
13480 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
13490 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
134a0 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
134b0 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
134c0 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
134d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
134e0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
134f0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
13500 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
13510 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
13520 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a  Printf("   skip:
13530 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
13540 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
13550 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
13560 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
13570 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
13580 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
13590 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
135a0 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
135b0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
135c0 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
135d0 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
135e0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
135f0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
13600 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
13610 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
13620 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
13630 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
13640 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
13650 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
13660 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
13670 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
13680 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
13690 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
136a0 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
136b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
136c0 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63  ugPrintf("replac
136d0 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  e: ");.      whe
136e0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
136f0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
13700 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
13710 67 50 72 69 6e 74 66 28 22 20 20 20 77 69 74 68  gPrintf("   with
13720 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : ");.    }else{
13730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
13740 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61  bugPrintf("    a
13750 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  dd: ");.    }.  
13760 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
13770 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
13780 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
13790 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
137a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
137b0 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
137c0 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
137d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
137e0 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
137f0 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
13800 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
13810 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
13820 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
13830 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13840 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13850 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
13860 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
13870 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
13880 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
13890 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
138a0 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
138b0 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
138c0 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
138d0 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
138e0 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
138f0 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
13900 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
13910 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
13920 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
13930 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
13940 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
13950 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
13960 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
13970 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
13980 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
13990 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
139a0 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
139b0 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
139c0 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
139d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
139e0 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
139f0 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
13a00 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
13a10 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
13a20 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
13a30 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
13a40 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
13a50 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
13a60 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
13a70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
13a80 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
13a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
13aa0 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
13ab0 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
13ac0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
13ad0 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
13ae0 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
13af0 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
13b00 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
13b10 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
13b20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
13b30 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
13b40 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
13b50 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
13b60 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
13b70 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
13b80 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
13b90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
13ba0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
13bb0 26 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70  & pIndex->idxTyp
13bc0 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
13bd0 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 70  E_IPK ){.      p
13be0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
13bf0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
13c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13c10 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
13c20 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20   WhereLoop.nOut 
13c30 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74  value downward t
13c40 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65  o account for te
13c50 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48  rms of the.** WH
13c60 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
13c70 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f  reference the lo
13c80 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65  op but which are
13c90 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a   not used by an.
13ca0 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46  ** index..*.** F
13cb0 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63  or every WHERE c
13cc0 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
13cd0 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  is not used by t
13ce0 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  he index.** and 
13cf0 77 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74  which has a trut
13d00 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73  h probability as
13d10 73 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66  signed by one of
13d20 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28   the likelihood(
13d30 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20  ),.** likely(), 
13d40 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51  or unlikely() SQ
13d50 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64  L functions, red
13d60 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  uce the estimate
13d70 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f  d number.** of o
13d80 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68  utput rows by th
13d90 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70  e probability sp
13da0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
13db0 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72  UNING:  For ever
13dc0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
13dd0 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
13de0 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
13df0 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64  x.** and which d
13e00 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
13e10 61 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70  assigned truth p
13e20 72 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72  robability, heur
13e30 69 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69  istics.** descri
13e40 62 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73  bed below are us
13e50 65 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74  ed to try to est
13e60 69 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20  imate the truth 
13e70 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20  probability..** 
13e80 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73  TODO --> Perhaps
13e90 20 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69   this is somethi
13ea0 6e 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65  ng that could be
13eb0 20 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74   improved by bet
13ec0 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61  ter.** table sta
13ed0 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48  tistics..**.** H
13ee0 65 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74  euristic 1:  Est
13ef0 69 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20  imate the truth 
13f00 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39  probability as 9
13f10 33 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37  3.75%.  The 93.7
13f20 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72  5%.** value corr
13f30 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e  esponds to -1 in
13f40 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e   LogEst notation
13f50 2c 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20  , so this means 
13f60 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  decrement.** the
13f70 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20   WhereLoop.nOut 
13f80 66 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20  field for every 
13f90 73 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  such WHERE claus
13fa0 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65  e term..**.** He
13fb0 75 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74  uristic 2:  If t
13fc0 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20  here exists one 
13fd0 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
13fe0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
13ff0 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58  e.** form "x==EX
14000 50 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20  PR" and EXPR is 
14010 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30  not a constant 0
14020 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65   or 1, then make
14030 20 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e   sure the.** fin
14040 61 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  al output row es
14050 74 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65  timate is no gre
14060 61 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66  ater than 1/4 of
14070 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
14080 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20  r.** of rows in 
14090 74 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f  the table.  In o
140a0 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75  ther words, assu
140b0 6d 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20  me that x==EXPR 
140c0 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f  will filter.** o
140d0 75 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75  ut at least 3 ou
140e0 74 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66  t of 4 rows.  If
140f0 20 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30   EXPR is -1 or 0
14100 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62   or 1, then mayb
14110 65 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c  e the.** "x" col
14120 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f  umn is boolean o
14130 72 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f  r else -1 or 0 o
14140 72 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20  r 1 is a common 
14150 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a  default value.**
14160 20 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75   on the "x" colu
14170 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61  mn and so in tha
14180 74 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20  t case only cap 
14190 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65  the output row e
141a0 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f  stimate.** at 1/
141b0 32 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34  2 instead of 1/4
141c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
141d0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
141e0 41 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43  Adjust(.  WhereC
141f0 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
14200 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
14210 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ause */.  WhereL
14220 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20  oop *pLoop,     
14230 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20   /* The loop to 
14240 61 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20  adjust downward 
14250 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77  */.  LogEst nRow
14260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14270 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
14280 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
14290 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  e */.){.  WhereT
142a0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b  erm *pTerm, *pX;
142b0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c  .  Bitmask notAl
142c0 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d  lowed = ~(pLoop-
142d0 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d  >prereq|pLoop->m
142e0 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20  askSelf);.  int 
142f0 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73  i, j, k;.  LogEs
14300 74 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20  t iReduce = 0;  
14310 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74    /* pLoop->nOut
14320 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65   should not exce
14330 65 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20  ed nRow-iReduce 
14340 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  */..  assert( (p
14350 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
14360 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
14370 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  )==0 );.  for(i=
14380 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72  pWC->nTerm, pTer
14390 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69  m=pWC->a; i>0; i
143a0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
143b0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
143c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
143d0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
143e0 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
143f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
14400 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
14410 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
14420 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74  kSelf)==0 ) cont
14430 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
14440 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
14450 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30  & notAllowed)!=0
14460 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14470 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c   for(j=pLoop->nL
14480 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
14490 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  -){.      pX = p
144a0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
144b0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30  .      if( pX==0
144c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
144d0 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d     if( pX==pTerm
144e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
144f0 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e  if( pX->iParent>
14500 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70  =0 && (&pWC->a[p
14510 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54  X->iParent])==pT
14520 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
14530 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
14540 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
14550 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
14560 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
14570 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
14580 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65  lity is specifie
14590 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65  d using the like
145a0 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a  lihood() hints,.
145b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
145c0 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c  use the probabil
145d0 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20  ity provided by 
145e0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
145f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
14600 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d  p->nOut += pTerm
14610 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
14620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14630 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65    /* In the abse
14640 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20  nce of explicit 
14650 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
14660 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74  ies, use heurist
14670 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ics to.        *
14680 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e  * guess a reason
14690 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61  able truth proba
146a0 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  bility. */.     
146b0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d     pLoop->nOut--
146c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
146d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
146e0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
146f0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
14700 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
14710 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
14720 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14730 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
14740 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
14750 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14760 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
14770 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20  (pRight, &k) && 
14780 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20  k>=(-1) && k<=1 
14790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  ){.            k
147a0 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
147b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
147c0 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20      k = 20;.    
147d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
147e0 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20    if( iReduce<k 
147f0 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20  ) iReduce = k;. 
14800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14820 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e   pLoop->nOut > n
14830 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70  Row-iReduce )  p
14840 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  Loop->nOut = nRo
14850 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a  w - iReduce;.}..
14860 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65 72  /* .** Term pTer
14870 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72 61  m is a vector ra
14880 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  nge comparison o
14890 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66 69  peration. The fi
148a0 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  rst comparison.*
148b0 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20  * in the vector 
148c0 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
148d0 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 45   using column nE
148e0 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  q of the index. 
148f0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
14900 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
14910 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65 63  al number of vec
14920 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68 61  tor elements tha
14930 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  t can be used.**
14940 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
14950 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e  range comparison
14960 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
14970 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
14980 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 48  y is:.**.**   WH
14990 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28 62  ERE a = ? AND (b
149a0 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f 2c  , c, d) > (?, ?,
149b0 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74 68   ?).**.** and th
149c0 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20  e index:.**.**  
149d0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e 2e   CREATE INDEX ..
149e0 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20 64  . ON (a, b, c, d
149f0 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  , e).**.** then 
14a00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
14a10 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 77  uld be invoked w
14a20 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20 76  ith nEq=1. The v
14a30 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
14a40 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73  .** this case is
14a50 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   3..*/.static in
14a60 74 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74  t whereRangeVect
14a70 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  orLen(.  Parse *
14a80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
14a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14aa0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
14ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
14ac0 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49 64  rsor open on pId
14ad0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
14ae0 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  dx,         /* T
14af0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 75  he index to be u
14b00 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75 61  sed for a inequa
14b10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
14b20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20  */.  int nEq,   
14b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14b40 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71 75  ber of prior equ
14b50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
14b60 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78 20  s on same index 
14b70 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
14b80 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68 65  pTerm     /* The
14b90 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c 69   vector inequali
14ba0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ty constraint */
14bb0 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
14bc0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
14bd0 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70 45  orSize(pTerm->pE
14be0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
14bf0 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d 20  nt i;..  nCmp = 
14c00 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78 2d  MIN(nCmp, (pIdx-
14c10 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29 29  >nColumn - nEq))
14c20 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e  ;.  for(i=1; i<n
14c30 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  Cmp; i++){.    /
14c40 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61 72  * Test if compar
14c50 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d 20  ison i of pTerm 
14c60 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  is compatible wi
14c70 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45 71  th column (i+nEq
14c80 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ) .    ** of the
14c90 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c 20   index. If not, 
14ca0 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20 20  exit the loop.  
14cb0 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 3b  */.    char aff;
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
14ce0 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  on affinity */. 
14cf0 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
14d00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14d10 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c 75   /* Indexed colu
14d20 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  mns affinity */.
14d30 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
14d40 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
14d50 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
14d60 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14d70 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  ce */.    Expr *
14d80 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45  pLhs = pTerm->pE
14d90 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c  xpr->pLeft->x.pL
14da0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14db0 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20  .    Expr *pRhs 
14dc0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
14dd0 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20  pRight;.    if( 
14de0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45 50  pRhs->flags & EP
14df0 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20  _xIsSelect ){.  
14e00 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d      pRhs = pRhs-
14e10 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
14e20 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
14e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e40 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e   pRhs = pRhs->x.
14e50 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14e60 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
14e70 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
14e80 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  LHS of the compa
14e90 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
14ea0 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 20  n reference to. 
14eb0 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
14ec0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69  column of the ri
14ed0 67 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c 65  ght source table
14ee0 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 73  . And that the s
14ef0 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72  ort.    ** order
14f00 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
14f10 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d 65  lumn is the same
14f20 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72 64   as the sort ord
14f30 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  er of the.    **
14f40 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78 20   leftmost index 
14f50 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20 20  column.  */.    
14f60 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54 4b  if( pLhs->op!=TK
14f70 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c 7c  _COLUMN .     ||
14f80 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d 69   pLhs->iTable!=i
14f90 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68  Cur .     || pLh
14fa0 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78  s->iColumn!=pIdx
14fb0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45 71  ->aiColumn[i+nEq
14fc0 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  ] .     || pIdx-
14fd0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e 45  >aSortOrder[i+nE
14fe0 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74 4f  q]!=pIdx->aSortO
14ff0 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29 7b  rder[nEq].    ){
15000 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15010 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
15020 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e  e( pLhs->iColumn
15030 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20 20  ==XN_ROWID );.  
15040 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
15050 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
15060 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  Rhs, sqlite3Expr
15070 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29 3b  Affinity(pLhs));
15080 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 73 71  .    idxaff = sq
15090 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
150a0 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e 70  Affinity(pIdx->p
150b0 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43 6f  Table, pLhs->iCo
150c0 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20 61  lumn);.    if( a
150d0 66 66 21 3d 69 64 78 61 66 66 20 29 20 62 72 65  ff!=idxaff ) bre
150e0 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ak;..    pColl =
150f0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
15100 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
15110 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
15120 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  ;.    if( pColl=
15130 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15140 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
15150 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
15160 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b   pIdx->azColl[i+
15170 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20  nEq]) ) break;. 
15180 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
15190 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
151a0 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65  he cost C by the
151b0 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72   costMult facter
151c0 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f   T.  This only o
151d0 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70  ccurs if.** comp
151e0 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49  iled with -DSQLI
151f0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
15200 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  LT.*/.#ifdef SQL
15210 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
15220 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70  ULT.# define App
15230 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
15240 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65  (C,T)  C += T.#e
15250 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70  lse.# define App
15260 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
15270 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (C,T).#endif../*
15280 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66  .** We have so f
15290 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c  ar matched pBuil
152a0 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
152b0 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20  ee.nEq terms of 
152c0 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49  the .** index pI
152d0 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74  ndex. Try to mat
152e0 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
152f0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
15300 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
15310 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
15320 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74  >nOut contains t
15330 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
15340 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
15350 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  o be visited by 
15360 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20  filtering using 
15370 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d  the nEq .** term
15380 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73  s only. If it is
15390 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20   modified, this 
153a0 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65  value is restore
153b0 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a  d before this .*
153c0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
153d0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  ns..**.** If pPr
153e0 6f 62 65 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51  obe->idxType==SQ
153f0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b  LITE_IDXTYPE_IPK
15400 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
15410 64 65 78 20 69 73 20 0a 2a 2a 20 61 20 66 61 6b  dex is .** a fak
15420 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72  e index used for
15430 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
15440 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
15450 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
15460 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
15470 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
15480 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
15490 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
154a0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
154b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
154c0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
154d0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
154e0 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
154f0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
15500 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
15510 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
15520 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
15530 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
15560 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
15570 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
15580 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
15590 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
155a0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
155b0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
155c0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
155d0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
155e0 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
155f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15600 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
15610 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
15620 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
15630 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
15640 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
15650 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15670 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
15680 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
15690 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
156a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156c0 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
156d0 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
156e0 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
15710 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
15720 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
15730 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15750 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
15760 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
15770 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
15780 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
15790 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
157a0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
157b0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
157c0 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
157d0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
157e0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
157f0 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
15800 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
15810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15820 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
15830 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15840 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
15850 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20  d_nBtm;         
15860 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15870 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15880 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
15890 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
158a0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
158b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
158c0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
158d0 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a  u.btree.nTop */.
158e0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
158f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15900 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
15910 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
15920 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
15930 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
15940 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15950 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15960 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
15970 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
15980 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15990 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
159a0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
159b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
159c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
159d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
159e0 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
159f0 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
15a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15a10 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
15a20 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
15a30 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a50 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
15a60 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
15a70 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
15a80 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
15a90 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
15aa0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
15ab0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
15ac0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
15ad0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
15ae0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
15af0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15b00 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
15b10 38 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e  800, ("BEGIN %s.
15b20 61 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c  addBtreeIdx(%s),
15b30 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
15b60 3e 7a 4e 61 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a  >zName,pProbe->z
15b70 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74  Name, pNew->u.bt
15b80 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73  ree.nEq));..  as
15b90 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
15ba0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
15bb0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
15bc0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
15bd0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15be0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
15bf0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
15c00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
15c10 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
15c20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
15c30 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
15c40 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
15c50 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30  >u.btree.nBtm==0
15c60 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   );.    opMask =
15c70 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
15c80 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
15c90 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_LE|WO_ISNULL|W
15ca0 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_IS;.  }.  if( 
15cb0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
15cc0 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
15cd0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
15ce0 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
15cf0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
15d00 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
15d10 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61  nColumn );..  sa
15d20 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
15d30 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
15d40 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77  aved_nBtm = pNew
15d50 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a  ->u.btree.nBtm;.
15d60 20 20 73 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70    saved_nTop = p
15d70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
15d80 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  p;.  saved_nSkip
15d90 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
15da0 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
15db0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
15dc0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
15dd0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
15de0 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
15df0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
15e00 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
15e10 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72  ew->nOut;.  pTer
15e20 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
15e30 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
15e40 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
15e50 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71  ursor, saved_nEq
15e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e70 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
15e80 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65  , pProbe);.  pNe
15e90 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
15ea0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
15eb0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
15ec0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
15ed0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66  tLog(rSize);.  f
15ee0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
15ef0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
15f00 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
15f10 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
15f20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65     u16 eOp = pTe
15f30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20  rm->eOperator;  
15f40 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
15f50 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  r pTerm->eOperat
15f60 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74  or */.    LogEst
15f70 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c   rCostIdx;.    L
15f80 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75  ogEst nOutUnadju
15f90 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  sted;        /* 
15fa0 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29  nOut before IN()
15fb0 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73   and WHERE adjus
15fc0 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  tments */.    in
15fd0 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65  t nIn = 0;.#ifde
15fe0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15ff0 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52  STAT4.    int nR
16000 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
16010 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23  er->nRecValid;.#
16020 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65  endif.    if( (e
16030 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  Op==WO_ISNULL ||
16040 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
16050 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
16060 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f  .     && indexCo
16070 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f  lumnNotNull(pPro
16080 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20  be, saved_nEq). 
16090 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74     ){.      cont
160a0 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20  inue; /* ignore 
160b0 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f  IS [NOT] NULL co
160c0 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54  nstraints on NOT
160d0 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
160e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
160f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
16100 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
16110 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  lf ) continue;..
16120 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
16130 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f  low the upper bo
16140 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70  und of a LIKE op
16150 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65  timization range
16160 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20   constraint.    
16170 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61  ** to mix with a
16180 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75   lower range bou
16190 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68  nd from some oth
161a0 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20  er source */.   
161b0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
161c0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
161d0 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70  PT && pTerm->eOp
161e0 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20  erator==WO_LT ) 
161f0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
16200 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 63  * Do not allow c
16210 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20  onstraints from 
16220 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
16230 20 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74   to be used by t
16240 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74 20  he.    ** right 
16250 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
16260 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73  JOIN.  Only cons
16270 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 4f  traints in the O
16280 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20 20  N clause are.   
16290 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20   ** allowed */. 
162a0 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67     if( (pSrc->fg
162b0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
162c0 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20  EFT)!=0.     && 
162d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
162e0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
162f0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
16300 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
16310 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
16320 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
16330 70 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64  pProbe) && saved
16340 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  _nEq==pProbe->nK
16350 65 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  eyCol-1 ){.     
16360 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
16370 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
16380 44 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  DF_UNIQUE;.    }
16390 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69  else{.      pBui
163a0 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c  lder->bldFlags |
163b0 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e  = SQLITE_BLDF_IN
163c0 44 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DEXED;.    }.   
163d0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
163e0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
163f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
16400 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
16410 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  q;.    pNew->u.b
16420 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
16430 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77  d_nBtm;.    pNew
16440 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
16450 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20   saved_nTop;.   
16460 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
16470 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
16480 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
16490 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
164a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
164b0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
164c0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
164d0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
164e0 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
164f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
16500 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
16510 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
16520 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
16530 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
16540 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
16550 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
16560 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16570 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
16580 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
16590 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
165a0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
165b0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
165c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
165d0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
165e0 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
165f0 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
16600 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
16610 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
16620 72 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  r;.      if( Exp
16630 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16640 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
16650 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16660 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
16670 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68  .)":  TUNING: th
16680 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
16690 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   25 rows */.    
166a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
166b0 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
166c0 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
166d0 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 0a  3LogEst(25) );..
166e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
166f0 78 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61 63  xpression may ac
16700 74 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68 65  tually be of the
16710 20 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e 20   form (x, y) IN 
16720 28 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20  (SELECT...)..   
16730 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
16740 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61 20  case there is a 
16750 73 65 70 61 72 61 74 65 20 74 65 72 6d 20 66 6f  separate term fo
16760 72 20 65 61 63 68 20 6f 66 20 28 78 29 20 61 6e  r each of (x) an
16770 64 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20 2a  d (y)..        *
16780 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6e  * However, the n
16790 49 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73 68  In multiplier sh
167a0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70 70  ould only be app
167b0 6c 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f  lied once, not o
167c0 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nce.        ** f
167d0 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 65 72  or each such ter
167e0 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  m. The following
167f0 20 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68 61   loop checks tha
16800 74 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a 20  t pTerm is the. 
16810 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
16820 73 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73 65  such term in use
16830 2c 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20 62  , and sets nIn b
16840 61 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20 69  ack to 0 if it i
16850 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  s not. */.      
16860 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
16870 77 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b  w->nLTerm-1; i++
16880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
16890 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
168a0 20 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d   && pNew->aLTerm
168b0 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70  [i]->pExpr==pExp
168c0 72 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  r ) nIn = 0;.   
168d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
168e0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
168f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  xpr->x.pList && 
16900 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
16910 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
16920 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75    /* "x IN (valu
16930 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20  e, value, ...)" 
16940 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
16950 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
16960 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
16970 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
16980 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d       if( pProbe-
16990 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20 20 20  >hasStat1 ){.   
169a0 20 20 20 20 20 4c 6f 67 45 73 74 20 4d 2c 20 6c       LogEst M, l
169b0 6f 67 4b 2c 20 73 61 66 65 74 79 4d 61 72 67 69  ogK, safetyMargi
169c0 6e 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 65  n;.        /* Le
169d0 74 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  t:.        **   
169e0 4e 20 3d 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  N = the total nu
169f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
16a00 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20  the table.      
16a10 20 20 2a 2a 20 20 20 4b 20 3d 20 74 68 65 20 6e    **   K = the n
16a20 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
16a30 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
16a40 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20  he IN operator. 
16a50 20 20 20 20 20 20 20 2a 2a 20 20 20 4d 20 3d 20         **   M = 
16a60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16a70 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
16a80 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 73  that match terms
16a90 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20   to the .       
16aa0 20 2a 2a 20 20 20 20 20 20 20 74 6f 20 74 68 65   **       to the
16ab0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 73 61 6d   left in the sam
16ac0 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  e index.  If the
16ad0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
16ae0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  on.        **   
16af0 20 20 20 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73      the left-mos
16b00 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2c 20  t index column, 
16b10 4d 3d 3d 4e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M==N..        **
16b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 69 76 65  .        ** Give
16b30 6e 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  n the definition
16b40 73 20 61 62 6f 76 65 2c 20 69 74 20 69 73 20 62  s above, it is b
16b50 65 74 74 65 72 20 74 6f 20 6f 6d 69 74 20 74 68  etter to omit th
16b60 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20  e IN operator.  
16b70 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
16b80 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 61  e index lookup a
16b90 6e 64 20 69 6e 73 74 65 61 64 20 64 6f 20 61 20  nd instead do a 
16ba0 73 63 61 6e 20 6f 66 20 74 68 65 20 4d 20 65 6c  scan of the M el
16bb0 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20 20 20 20  ements,.        
16bc0 2a 2a 20 74 65 73 74 69 6e 67 20 65 61 63 68 20  ** testing each 
16bd0 73 63 61 6e 6e 65 64 20 72 6f 77 20 61 67 61 69  scanned row agai
16be0 6e 73 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  nst the IN opera
16bf0 74 6f 72 20 73 65 70 61 72 61 74 65 6c 79 2c 20  tor separately, 
16c00 69 66 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  if:.        **. 
16c10 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
16c20 20 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b 2a 6c 6f   M*log(K) < K*lo
16c30 67 28 4e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  g(N).        **.
16c40 20 20 20 20 20 20 20 20 2a 2a 20 4f 75 72 20 65          ** Our e
16c50 73 74 69 6d 61 74 65 73 20 66 6f 72 20 4d 2c 20  stimates for M, 
16c60 4b 2c 20 61 6e 64 20 4e 20 6d 69 67 68 74 20 62  K, and N might b
16c70 65 20 69 6e 61 63 63 75 72 61 74 65 2c 20 73 6f  e inaccurate, so
16c80 20 77 65 20 62 75 69 6c 64 20 69 6e 0a 20 20 20   we build in.   
16c90 20 20 20 20 20 2a 2a 20 61 20 73 61 66 65 74 79       ** a safety
16ca0 20 6d 61 72 67 69 6e 20 6f 66 20 32 20 28 4c 6f   margin of 2 (Lo
16cb0 67 45 73 74 3a 20 31 30 29 20 74 68 61 74 20 66  gEst: 10) that f
16cc0 61 76 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  avors using the 
16cd0 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20  IN operator.    
16ce0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
16cf0 69 6e 64 65 78 2c 20 61 73 20 75 73 69 6e 67 20  index, as using 
16d00 61 6e 20 69 6e 64 65 78 20 68 61 73 20 62 65 74  an index has bet
16d10 74 65 72 20 77 6f 72 73 74 2d 63 61 73 65 20 62  ter worst-case b
16d20 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 20 20 20  ehavior..       
16d30 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74   ** If we do not
16d40 20 68 61 76 65 20 72 65 61 6c 20 73 71 6c 69 74   have real sqlit
16d50 65 5f 73 74 61 74 31 20 64 61 74 61 2c 20 61 6c  e_stat1 data, al
16d60 77 61 79 73 20 70 72 65 66 65 72 20 74 6f 20 75  ways prefer to u
16d70 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
16d80 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
16d90 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 20 3d 20   */.        M = 
16da0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
16db0 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  Est[saved_nEq];.
16dc0 20 20 20 20 20 20 20 20 6c 6f 67 4b 20 3d 20 65          logK = e
16dd0 73 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20 20 20 20  stLog(nIn);.    
16de0 20 20 20 20 73 61 66 65 74 79 4d 61 72 67 69 6e      safetyMargin
16df0 20 3d 20 31 30 3b 20 20 2f 2a 20 54 55 4e 49 4e   = 10;  /* TUNIN
16e00 47 3a 20 65 78 74 72 61 20 77 65 69 67 68 74 20  G: extra weight 
16e10 66 6f 72 20 69 6e 64 65 78 65 64 20 49 4e 20 2a  for indexed IN *
16e20 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 20  /.        if( M 
16e30 2b 20 6c 6f 67 4b 20 2b 20 73 61 66 65 74 79 4d  + logK + safetyM
16e40 61 72 67 69 6e 20 3c 20 6e 49 6e 20 2b 20 72 4c  argin < nIn + rL
16e50 6f 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ogSize ){.      
16e60 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
16e70 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x40,.           
16e80 20 28 22 53 63 61 6e 20 70 72 65 66 65 72 72 65   ("Scan preferre
16e90 64 20 6f 76 65 72 20 49 4e 20 6f 70 65 72 61 74  d over IN operat
16ea0 6f 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20  or on column %d 
16eb0 6f 66 20 5c 22 25 73 5c 22 20 28 25 64 3c 25 64  of \"%s\" (%d<%d
16ec0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
16ed0 20 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50     saved_nEq, pP
16ee0 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c  robe->zName, M+l
16ef0 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67  ogK+10, nIn+rLog
16f00 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
16f10 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
16f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16f30 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
16f40 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0x40,.          
16f50 20 20 28 22 49 4e 20 6f 70 65 72 61 74 6f 72 20    ("IN operator 
16f60 70 72 65 66 65 72 72 65 64 20 6f 6e 20 63 6f 6c  preferred on col
16f70 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22  umn %d of \"%s\"
16f80 20 28 25 64 3e 3d 25 64 29 5c 6e 22 2c 0a 20 20   (%d>=%d)\n",.  
16f90 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64             saved
16fa0 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  _nEq, pProbe->zN
16fb0 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20  ame, M+logK+10, 
16fc0 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a  nIn+rLogSize));.
16fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16fe0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  }.      pNew->ws
16ff0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
17000 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 7d 65  OLUMN_IN;.    }e
17010 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
17020 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20  O_EQ|WO_IS) ){. 
17030 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
17040 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
17050 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20  [saved_nEq];.   
17060 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
17070 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
17080 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72  _EQ;.      asser
17090 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e  t( saved_nEq==pN
170a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
170b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
170c0 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20  l==XN_ROWID .   
170d0 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20      || (iCol>=0 
170e0 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  && nInMul==0 && 
170f0 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
17100 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20  e->nKeyCol-1).  
17110 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
17120 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
17130 44 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 75 6e 69  D || pProbe->uni
17140 71 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20 20 20 20  qNotNull .      
17150 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6e     || (pProbe->n
17160 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 50 72  KeyCol==1 && pPr
17170 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 20 26 26 20  obe->onError && 
17180 65 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a 20 20 20  eOp==WO_EQ) .   
17190 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
171a0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
171b0 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
171c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
171d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
171e0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
171f0 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
17200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
17220 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
17230 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
17240 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
17250 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
17260 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
17270 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
17280 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
17290 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
172a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
172b0 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
172c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
172d0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
172e0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
172f0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e  _LIMIT;.      pN
17300 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
17310 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63   = whereRangeVec
17320 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20  torLen(.        
17330 20 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e    pParse, pSrc->
17340 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c  iCursor, pProbe,
17350 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72   saved_nEq, pTer
17360 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  m.      );.     
17370 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
17380 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
17390 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
173a0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
173b0 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20  IKEOPT ){.      
173c0 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72    /* Range contr
173d0 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
173e0 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70  from the LIKE op
173f0 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20  timization are. 
17400 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
17410 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20   used in pairs. 
17420 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20  */.        pTop 
17430 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20  = &pTerm[1];.   
17440 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
17450 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  op-(pTerm->pWC->
17460 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  a))<pTerm->pWC->
17470 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
17480 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77   assert( pTop->w
17490 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
174a0 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20  KEOPT );.       
174b0 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65   assert( pTop->e
174c0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
174d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  );.        if( w
174e0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
174f0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
17500 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
17510 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
17520 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
17530 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
17540 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20   = pTop;.       
17550 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
17560 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
17570 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
17580 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
17590 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
175a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
175b0 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54  rt( eOp & (WO_LT
175c0 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
175d0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
175e0 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
175f0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
17600 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
17610 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
17620 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
17630 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
17640 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  IT;.      pNew->
17650 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77  u.btree.nTop = w
17660 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c  hereRangeVectorL
17670 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  en(.          pP
17680 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  arse, pSrc->iCur
17690 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61 76  sor, pProbe, sav
176a0 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20  ed_nEq, pTerm.  
176b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 54 6f      );.      pTo
176c0 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
176d0 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
176e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
176f0 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
17720 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
17730 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   : 0;.    }..   
17740 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
17750 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20  t pNew->nOut is 
17760 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
17770 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
17780 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
17790 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69  visited by the i
177a0 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65  ndex scan before
177b0 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72   considering ter
177c0 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a  m pTerm, or the.
177d0 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66      ** values of
177e0 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e   nIn and nInMul.
177f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
17800 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61   assuming that a
17810 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e  ll .    ** "x IN
17820 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65  (...)" terms are
17830 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22   replaced with "
17840 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f  x = ?". This blo
17850 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a  ck updates.    *
17860 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * the value of p
17870 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63  New->nOut to acc
17880 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28  ount for pTerm (
17890 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d  but not nIn/nInM
178a0 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ul).  */.    ass
178b0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
178c0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
178d0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
178e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
178f0 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
17900 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
17910 74 20 75 73 69 6e 67 20 73 74 61 74 34 20 64 61  t using stat4 da
17920 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
17930 20 69 73 20 6e 6f 20 73 74 61 74 34 0a 20 20 20   is no stat4.   
17940 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e     ** data, usin
17950 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74  g some other est
17960 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20  imate.  */.     
17970 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
17980 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
17990 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c  der, pBtm, pTop,
179a0 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73   pNew);.    }els
179b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  e{.      int nEq
179c0 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72   = ++pNew->u.btr
179d0 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73  ee.nEq;.      as
179e0 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
179f0 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f  ISNULL|WO_EQ|WO_
17a00 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20  IN|WO_IS) );..  
17a10 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
17a20 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
17a30 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
17a40 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
17a50 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  <=0 && pProbe->a
17a60 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45  iColumn[saved_nE
17a70 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  q]>=0 ){.       
17a80 20 61 73 73 65 72 74 28 20 28 65 4f 70 20 26 20   assert( (eOp & 
17a90 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30  WO_IN) || nIn==0
17aa0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
17ab0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
17ac0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  N );.        pNe
17ad0 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d  w->nOut += pTerm
17ae0 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
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 7d 65  -= nIn;.      }e
17b10 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
17b20 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
17b30 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
17b40 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
17b50 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20    if( nInMul==0 
17b60 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
17b70 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
17b80 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
17b90 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
17ba0 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a  obe->nSampleCol.
17bb0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f           && ((eO
17bc0 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c  p & WO_IN)==0 ||
17bd0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17be0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
17bf0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20  EP_xIsSelect)). 
17c00 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
17c10 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
17c20 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 34 29  b, SQLITE_Stat4)
17c30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
17c40 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
17c50 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
17c60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17c70 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
17c80 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
17c90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17ca0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
17cb0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
17cc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17cd0 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
17cf0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
17d00 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
17d10 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
17d20 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
17d30 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
17d40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
17d50 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
17d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17d70 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
17d80 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
17d90 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
17da0 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
17db0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17dc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17dd0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
17de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17df0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
17e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
17e10 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
17e20 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
17e30 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
17e40 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
17e50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
17e60 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
17e70 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
17e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17e90 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
17ea0 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
17eb0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
17ec0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
17ed0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
17ee0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
17ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17f00 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
17f10 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
17f20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17f30 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
17f40 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
17f50 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
17f60 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
17f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
17f80 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
17f90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
17fa0 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
17fb0 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
17fc0 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
17fd0 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
17fe0 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
17ff0 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
18000 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
18010 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
18020 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
18030 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
18040 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
18050 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
18060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18080 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
18090 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
180a0 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
180b0 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
180c0 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
180d0 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
180e0 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
180f0 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
18100 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
18110 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
18120 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
18130 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
18140 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
18150 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
18160 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
18170 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
18180 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  able.  */.    as
18190 73 65 72 74 28 20 70 53 72 63 2d 3e 70 54 61 62  sert( pSrc->pTab
181a0 2d 3e 73 7a 54 61 62 52 6f 77 3e 30 20 29 3b 0a  ->szTabRow>0 );.
181b0 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70      rCostIdx = p
181c0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20  New->nOut + 1 + 
181d0 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
181e0 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62  xRow)/pSrc->pTab
181f0 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
18200 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
18210 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c  ite3LogEstAdd(rL
18220 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78  ogSize, rCostIdx
18230 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  );.    if( (pNew
18240 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
18250 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
18260 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20  E_IPK))==0 ){.  
18270 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
18280 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
18290 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e  d(pNew->rRun, pN
182a0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a  ew->nOut + 16);.
182b0 20 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43      }.    ApplyC
182c0 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
182d0 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65  ew->rRun, pProbe
182e0 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75  ->pTable->costMu
182f0 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e  lt);..    nOutUn
18300 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d  adjusted = pNew-
18310 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d  >nOut;.    pNew-
18320 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20  >rRun += nInMul 
18330 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d  + nIn;.    pNew-
18340 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20  >nOut += nInMul 
18350 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65  + nIn;.    where
18360 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
18370 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20  (pBuilder->pWC, 
18380 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
18390 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
183a0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
183b0 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
183c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
183d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
183e0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  NGE ){.      pNe
183f0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
18400 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nOut;.    }else{
18410 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
18420 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  t = nOutUnadjust
18430 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ed;.    }..    i
18440 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
18450 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
18460 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  MIT)==0.     && 
18470 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
18480 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
18490 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77  n.    ){.      w
184a0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
184b0 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
184c0 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
184d0 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d  nMul+nIn);.    }
184e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
184f0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69  = saved_nOut;.#i
18500 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18510 4c 45 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  LE_STAT4.    pBu
18520 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
18530 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
18540 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
18550 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
18560 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
18570 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
18580 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
18590 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20  >u.btree.nBtm = 
185a0 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e  saved_nBtm;.  pN
185b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
185c0 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20   = saved_nTop;. 
185d0 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73   pNew->nSkip = s
185e0 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e  aved_nSkip;.  pN
185f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
18600 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70  ved_wsFlags;.  p
18610 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
18620 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  d_nOut;.  pNew->
18630 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
18640 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  LTerm;..  /* Con
18650 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b  sider using a sk
18660 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65  ip-scan if there
18670 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
18680 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
18690 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
186a0 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  for the left-mos
186b0 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  t terms of the i
186c0 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65  ndex, and if the
186d0 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75   average.  ** nu
186e0 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20  mber of repeats 
186f0 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
18700 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61   terms is at lea
18710 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a  st 18. .  **.  *
18720 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62  * The magic numb
18730 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65  er 18 is selecte
18740 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74  d on the basis t
18750 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20  hat scanning 17 
18760 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d  rows.  ** is alm
18770 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b  ost always quick
18780 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78  er than an index
18790 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75   seek (even thou
187a0 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a  gh if the index.
187b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65    ** contains fe
187c0 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f  wer than 2^17 ro
187d0 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68  ws we assume oth
187e0 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20  erwise in other 
187f0 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68  parts of.  ** th
18800 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76  e code). And, ev
18810 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c  en if it is not,
18820 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
18830 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65  e too much slowe
18840 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20  r. .  ** On the 
18850 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20  other hand, the 
18860 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c  extra seeks coul
18870 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73  d end up being s
18880 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
18890 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  * more expensive
188a0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
188b0 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  42==sqlite3LogEs
188c0 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73  t(18) );.  if( s
188d0 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f  aved_nEq==saved_
188e0 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65  nSkip.   && save
188f0 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e  d_nEq+1<pProbe->
18900 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50  nKeyCol.   && pP
18910 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e  robe->noSkipScan
18920 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  ==0.   && Optimi
18930 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
18940 2c 20 53 51 4c 49 54 45 5f 53 6b 69 70 53 63 61  , SQLITE_SkipSca
18950 6e 29 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  n).   && pProbe-
18960 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
18970 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
18980 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
18990 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
189a0 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
189b0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
189c0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
189d0 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
189e0 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
189f0 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
18a00 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
18a10 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
18a20 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
18a30 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
18a40 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
18a50 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18a60 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
18a70 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
18a80 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
18a90 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
18aa0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
18ab0 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
18ac0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
18ad0 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
18ae0 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
18af0 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
18b00 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
18b10 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
18b20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
18b30 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
18b40 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
18b50 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
18b60 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
18b70 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
18b80 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
18b90 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
18ba0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
18bb0 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
18bc0 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
18bd0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
18be0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
18bf0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
18c00 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
18c10 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
18c20 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
18c30 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
18c40 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
18c50 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
18c60 30 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64 42  0, ("END %s.addB
18c70 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71  treeIdx(%s), nEq
18c80 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a 20  =%d, rc=%d\n",. 
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 20 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61       pProbe->pTa
18cb0 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f  ble->zName, pPro
18cc0 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64  be->zName, saved
18cd0 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65  _nEq, rc));.  re
18ce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18cf0 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
18d00 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18d10 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
18d20 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
18d30 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
18d40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18d50 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
18d60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
18d70 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
18d80 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
18d90 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
18da0 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
18db0 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
18dc0 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
18dd0 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
18de0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
18df0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
18e00 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
18e10 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
18e20 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
18e30 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
18e40 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
18e50 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
18e60 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
18e70 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73   *pOB;.  ExprLis
18e80 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69  t *aColExpr;.  i
18e90 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
18ea0 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
18eb0 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
18ec0 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
18ed0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
18ee0 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
18ef0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
18f00 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
18f10 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
18f20 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
18f30 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
18f40 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 4f 42  ateAndLikely(pOB
18f50 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
18f60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
18f70 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
18f80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
18f90 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
18fa0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
18fb0 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
18fc0 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
18fd0 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
18fe0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
18ff0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
19000 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
19010 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
19020 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
19030 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
19040 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64 65  aColExpr = pInde
19050 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30 20  x->aColExpr)!=0 
19060 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  ){.      for(jj=
19070 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b  0; jj<pIndex->nK
19080 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  eyCol; jj++){.  
19090 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
190a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d  ->aiColumn[jj]!=
190b0 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e  XN_EXPR ) contin
190c0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
190d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
190e0 72 65 53 6b 69 70 28 70 45 78 70 72 2c 61 43 6f  reSkip(pExpr,aCo
190f0 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78  lExpr->a[jj].pEx
19100 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20 29  pr,iCursor)==0 )
19110 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
19120 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
19130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19140 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19150 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
19160 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
19170 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
19180 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
19190 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
191a0 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
191b0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
191c0 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
191d0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
191e0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
191f0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
19200 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
19210 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
19220 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
19230 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
19240 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72 73 65 20  *pTerm;.  Parse 
19250 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
19260 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
19270 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
19280 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
19290 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62    if( !whereUsab
192a0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
192b0 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e  Tab,pWC,pWhere->
192c0 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
192d0 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  0;.    pWhere = 
192e0 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a  pWhere->pRight;.
192f0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
19300 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
19310 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20  LITE_EnableQPSG 
19320 29 20 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20  ) pParse = 0;.  
19330 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
19340 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
19350 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
19360 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19370 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
19380 70 72 3b 0a 20 20 20 20 69 66 28 20 28 21 45 78  pr;.    if( (!Ex
19390 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
193a0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
193b0 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67  ) || pExpr->iRig
193c0 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
193d0 62 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  b).     && sqlit
193e0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
193f0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
19400 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a   pWhere, iTab) .
19410 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
19420 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
19430 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19440 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
19450 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
19460 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62  for a single tab
19470 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77  le of the join w
19480 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a  here the table.*
19490 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  * is identified 
194a0 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
194b0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
194c0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
194d0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
194e0 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
194f0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
19500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
19510 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
19520 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
19530 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
19540 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
19550 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
19560 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
19570 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
19580 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
19590 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
195a0 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
195b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
195c0 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
195f0 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
19600 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19620 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
19630 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
19640 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
19650 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
19660 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
19670 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
19680 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
19690 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
196a0 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
196b0 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
196c0 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
196d0 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
196e0 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
196f0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
19700 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
19710 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
19720 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
19730 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
19740 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
19750 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
19760 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
19770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
19780 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
19790 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
197a0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
197b0 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
197c0 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
197d0 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
197e0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
197f0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
19800 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
19810 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
19820 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
19830 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
19840 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
19850 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
19860 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
19870 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
19880 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
19890 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
198a0 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
198b0 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
198c0 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
198d0 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
198e0 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
198f0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
19900 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
19910 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
19920 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
19930 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
19940 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
19950 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
19960 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
19970 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
19980 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
19990 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
199a0 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
199b0 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
199c0 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
199d0 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
199e0 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
199f0 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
19a00 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
19a10 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
19a20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
19a30 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
19a40 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
19a50 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
19a60 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
19a70 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
19a80 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
19a90 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
19aa0 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
19ab0 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
19ac0 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
19ad0 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
19ae0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
19af0 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
19b00 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
19b10 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
19b20 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
19b30 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
19b40 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
19b50 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
19b60 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
19b70 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  eq             /
19b80 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
19b90 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
19ba0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
19bb0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
19bc0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
19bd0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
19be0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
19bf0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
19c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
19c10 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
19c20 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
19c30 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
19c40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
19c50 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
19c60 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
19c70 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
19c80 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
19c90 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
19ca0 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
19cb0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
19cc0 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
19cd0 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
19ce0 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
19cf0 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
19d00 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
19d10 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
19d20 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
19d30 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
19d40 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
19d50 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
19d60 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
19d70 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
19d80 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
19d90 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
19da0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
19db0 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
19dc0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
19dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
19de0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19df0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
19e00 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
19e10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
19e20 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
19e50 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
19e60 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
19e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
19e80 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
19e90 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
19ea0 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
19eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
19ec0 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
19ed0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
19ee0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
19ef0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19f10 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
19f20 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
19f30 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
19f40 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
19f50 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
19f60 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
19f70 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
19f80 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
19f90 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
19fa0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
19fb0 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
19fc0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
19fd0 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
19fe0 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
19ff0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
1a000 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
1a010 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
1a020 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
1a030 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
1a040 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
1a050 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1a060 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
1a070 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
1a080 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
1a090 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
1a0a0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
1a0b0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1a0c0 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
1a0d0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1a0e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1a0f0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
1a100 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
1a110 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
1a120 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
1a130 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
1a140 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
1a150 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
1a160 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
1a170 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
1a180 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
1a190 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
1a1a0 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
1a1b0 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
1a1c0 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
1a1d0 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
1a1e0 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
1a1f0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1a200 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1a210 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
1a220 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
1a230 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
1a240 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
1a250 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
1a260 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
1a270 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
1a280 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
1a290 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
1a2a0 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
1a2b0 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1a2c0 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1a2d0 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1a2e0 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1a2f0 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
1a300 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
1a310 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 73 50  szTabRow;.    sP
1a320 6b 2e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49  k.idxType = SQLI
1a330 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b 3b 0a  TE_IDXTYPE_IPK;.
1a340 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
1a350 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
1a360 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
1a370 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
1a380 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1a390 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1a3a0 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e    if( pSrc->fg.n
1a3b0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
1a3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
1a3d0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
1a3e0 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
1a3f0 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
1a400 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
1a410 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
1a420 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
1a430 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a440 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
1a450 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
1a460 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
1a470 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
1a480 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
1a490 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
1a4a0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
1a4b0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1a4c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
1a4d0 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
1a4e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
1a4f0 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
1a500 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f  r->pOrSet      /
1a510 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  * Not part of an
1a520 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
1a530 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66   */.   && (pWInf
1a540 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1a550 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
1a560 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  SE)==0.   && (pW
1a570 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1a580 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1a590 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
1a5a0 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e    && pSrc->pIBIn
1a5b0 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48  dex==0      /* H
1a5c0 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
1a5d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
1a5e0 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e   !pSrc->fg.notIn
1a5f0 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e  dexed   /* Has n
1a600 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  o NOT INDEXED cl
1a610 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61  ause */.   && Ha
1a620 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20  sRowid(pTab)    
1a630 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48       /* Not WITH
1a640 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1a650 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74   (FIXME: Why not
1a660 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ?) */.   && !pSr
1a670 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  c->fg.isCorrelat
1a680 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ed /* Not a corr
1a690 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
1a6a0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
1a6b0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20  fg.isRecursive  
1a6c0 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69  /* Not a recursi
1a6d0 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20  ve common table 
1a6e0 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20  expression. */. 
1a6f0 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
1a700 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
1a710 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
1a720 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1a730 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
1a740 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
1a750 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1a760 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1a770 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
1a780 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
1a790 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
1a7a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1a7b0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
1a7c0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
1a7d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1a7e0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
1a7f0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
1a800 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1a810 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
1a820 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
1a830 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
1a840 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
1a850 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
1a860 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a870 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
1a880 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1a890 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
1a8a0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1a8b0 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
1a8c0 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
1a8d0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1a8e0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73  is.        ** es
1a8f0 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a  timated to be X*
1a900 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
1a910 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1a920 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
1a930 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
1a940 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e  being indexed an
1a950 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28  d where X is 7 (
1a960 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e  LogEst=28) for n
1a970 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ormal.        **
1a980 20 74 61 62 6c 65 73 20 6f 72 20 30 2e 35 20 28   tables or 0.5 (
1a990 4c 6f 67 45 73 74 3d 2d 31 30 29 20 66 6f 72 20  LogEst=-10) for 
1a9a0 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
1a9b0 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  ries.  The value
1a9c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58  .        ** of X
1a9d0 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
1a9e0 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
1a9f0 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ries so that the
1aa00 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20   query planner. 
1aa10 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
1aa20 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76  e more aggressiv
1aa30 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69  e about generati
1aa40 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ng automatic ind
1aa50 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20  exes for.       
1aa60 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74   ** those object
1aa70 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  s, since there i
1aa80 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79  s no opportunity
1aa90 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20   to add schema. 
1aaa0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65         ** indexe
1aab0 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20  s on subqueries 
1aac0 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20  and views. */.  
1aad0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1aae0 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
1aaf0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1ab00 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1ab10 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
1ab20 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
1ab30 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
1ab40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
1ab50 74 75 70 20 2b 3d 20 32 38 3b 0a 20 20 20 20 20  tup += 28;.     
1ab60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ab70 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1ab80 20 2d 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   -= 10;.        
1ab90 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
1aba0 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
1abb0 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62  ew->rSetup, pTab
1abc0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1abd0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72       if( pNew->r
1abe0 53 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e  Setup<0 ) pNew->
1abf0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
1ac00 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
1ac10 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  ach index lookup
1ac20 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20   yields 20 rows 
1ac30 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  in the table.  T
1ac40 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
1ac50 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  s more than the 
1ac60 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31  usual guess of 1
1ac70 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65  0 rows, since we
1ac80 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20   have no way.   
1ac90 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69       ** of knowi
1aca0 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65  ng how selective
1acb0 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
1acc0 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20  ultimately be.  
1acd0 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  It would.       
1ace0 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61   ** not be unrea
1acf0 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20  sonable to make 
1ad00 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20  this value much 
1ad10 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
1ad20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1ad30 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d  43;  assert( 43=
1ad40 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
1ad50 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  0) );.        pN
1ad60 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
1ad70 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
1ad80 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
1ad90 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1ada0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1adb0 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
1adc0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1add0 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65   = mPrereq | pTe
1ade0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
1adf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1ae00 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1ae10 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1ae20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ae30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ae40 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
1ae50 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
1ae60 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
1ae70 64 69 63 65 73 2e 20 49 66 20 74 68 65 72 65 20  dices. If there 
1ae80 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
1ae90 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
1aea0 6e 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  nly .  ** consid
1aeb0 65 72 20 69 6e 64 65 78 20 70 50 72 6f 62 65 2e  er index pProbe.
1aec0 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
1aed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1aee0 72 6f 62 65 3b 20 0a 20 20 20 20 20 20 70 50 72  robe; .      pPr
1aef0 6f 62 65 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e  obe=(pSrc->pIBIn
1af00 64 65 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65  dex ? 0 : pProbe
1af10 2d 3e 70 4e 65 78 74 29 2c 20 69 53 6f 72 74 49  ->pNext), iSortI
1af20 64 78 2b 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66  dx++.  ){.    if
1af30 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
1af40 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
1af50 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
1af60 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63  artialIndex(pSrc
1af70 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20  ->iCursor, pWC, 
1af80 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
1af90 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
1afa0 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
1afb0 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72  iTab!=pSrc->iCur
1afc0 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74  sor );  /* See t
1afd0 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66  icket [98d973b8f
1afe0 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  5] */.      cont
1aff0 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
1b000 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
1b010 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
1b020 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
1b030 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e    if( pProbe->bN
1b040 6f 51 75 65 72 79 20 29 20 63 6f 6e 74 69 6e 75  oQuery ) continu
1b050 65 3b 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70  e;.    rSize = p
1b060 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
1b070 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  st[0];.    pNew-
1b080 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
1b090 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
1b0a0 72 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20  ree.nBtm = 0;.  
1b0b0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1b0c0 6e 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  nTop = 0;.    pN
1b0d0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
1b0e0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1b0f0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
1b100 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
1b110 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1b120 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
1b130 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20  req = mPrereq;. 
1b140 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1b150 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
1b160 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
1b170 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
1b180 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
1b190 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
1b1a0 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
1b1b0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
1b1c0 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
1b1d0 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
1b1e0 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
1b1f0 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
1b200 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
1b210 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
1b220 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1b230 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
1b240 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
1b250 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 64 78   if( pProbe->idx
1b260 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
1b270 54 59 50 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  TYPE_IPK ){.    
1b280 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
1b290 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
1b2a0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
1b2b0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
1b2c0 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
1b2d0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
1b2e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1b2f0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
1b300 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
1b310 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
1b320 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
1b330 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
1b340 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1b350 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
1b360 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
1b370 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
1b380 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
1b390 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
1b3a0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
1b3b0 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
1b3c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
1b3d0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1b3e0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1b3f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
1b400 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1b410 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1b420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b430 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
1b440 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1b450 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
1b460 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1b470 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
1b480 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
1b490 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
1b4a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1b4b0 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
1b4c0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 50  rc->colUsed & pP
1b4d0 72 6f 62 65 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  robe->colNotIdxe
1b4e0 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  d;.        pNew-
1b4f0 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
1b500 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
1b510 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
1b520 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
1b530 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
1b540 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
1b550 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
1b560 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
1b570 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
1b580 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72  b).       || pPr
1b590 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
1b5a0 72 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  re!=0.       || 
1b5b0 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
1b5c0 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
1b5d0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
1b5e0 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
1b5f0 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
1b600 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
1b610 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1b620 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1b630 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
1b640 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
1b650 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b660 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
1b670 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
1b680 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
1b690 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
1b6a0 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
1b6b0 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
1b6c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1b6d0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1b6e0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
1b6f0 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
1b700 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  The cost of visi
1b710 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72  ting the index r
1b720 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72  ows is N*K, wher
1b730 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e K is.        *
1b740 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  * between 1.1 an
1b750 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67  d 3.0, depending
1b760 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
1b770 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20   sizes of the.  
1b780 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61        ** index a
1b790 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a  nd table rows. *
1b7a0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1b7b0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
1b7c0 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
1b7d0 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73  zIdxRow)/pTab->s
1b7e0 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20  zTabRow;.       
1b7f0 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
1b800 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1b810 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
1b820 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20  ing index scan, 
1b830 61 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20  add in the cost 
1b840 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
1b850 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b  doing table look
1b860 75 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77  ups.  The cost w
1b870 69 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75  ill be 3x the nu
1b880 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
1b890 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54    ** lookups.  T
1b8a0 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ake into account
1b8b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1b8c0 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a  rms that can be.
1b8d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74            ** sat
1b8e0 69 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73  isfied using jus
1b8f0 74 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  t the index, and
1b900 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
1b910 75 69 72 65 20 61 0a 20 20 20 20 20 20 20 20 20  uire a.         
1b920 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70   ** table lookup
1b930 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c  . */.          L
1b940 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20  ogEst nLookup = 
1b950 72 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20  rSize + 16;  /* 
1b960 42 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20  Base cost:  N*3 
1b970 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
1b980 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69   ii;.          i
1b990 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
1b9a0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
1b9b0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1b9c0 70 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pWC2 = &pWInfo->
1b9d0 73 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66  sWC;.          f
1b9e0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32  or(ii=0; ii<pWC2
1b9f0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
1ba10 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
1ba20 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  pWC2->a[ii];.   
1ba30 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1ba40 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
1ba50 42 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70  ByIndex(pTerm->p
1ba60 45 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f  Expr, iCur, pPro
1ba70 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
1ba80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ba90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1baa0 20 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63        /* pTerm c
1bab0 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
1bac0 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
1bad0 6e 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65  ndex.  So reduce
1bae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1baf0 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
1bb00 62 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f  ber of table loo
1bb10 6b 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79  kups accordingly
1bb20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1bb30 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
1bb40 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
1bb50 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70           nLookup
1bb60 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
1bb70 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Prob;.          
1bb80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bb90 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d         nLookup--
1bba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bbb0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1bbc0 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
1bbd0 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d  _IS) ) nLookup -
1bbe0 3d 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20  = 19;.          
1bbf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1bc00 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
1bc10 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1bc20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1bc30 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e  dd(pNew->rRun, n
1bc40 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20  Lookup);.       
1bc50 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
1bc60 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
1bc70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
1bc80 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
1bc90 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
1bca0 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
1bcb0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
1bcc0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bcd0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1bce0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1bcf0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1bd00 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1bd10 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
1bd20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1bd30 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46    pBuilder->bldF
1bd40 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  lags = 0;.    rc
1bd50 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1bd60 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
1bd70 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
1bd80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42  , 0);.    if( pB
1bd90 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73  uilder->bldFlags
1bda0 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e  ==SQLITE_BLDF_IN
1bdb0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  DEXED ){.      /
1bdc0 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71 75  * If a non-uniqu
1bdd0 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 2c  e index is used,
1bde0 20 6f 72 20 69 66 20 61 20 70 72 65 66 69 78 20   or if a prefix 
1bdf0 6f 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a 20  of the key for. 
1be00 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20 69       ** unique i
1be10 6e 64 65 78 20 69 73 20 75 73 65 64 20 28 6d 61  ndex is used (ma
1be20 6b 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66  king the index f
1be30 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d  unctionally non-
1be40 75 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a 2a  unique).      **
1be50 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
1be60 5f 73 74 61 74 31 20 64 61 74 61 20 62 65 63 6f  _stat1 data beco
1be70 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f  mes important fo
1be80 72 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20 20  r scoring the.  
1be90 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20      ** plan */. 
1bea0 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
1beb0 61 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73 55  ags |= TF_StatsU
1bec0 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  sed;.    }.#ifde
1bed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bee0 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65  STAT4.    sqlite
1bef0 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28  3Stat4ProbeFree(
1bf00 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
1bf10 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
1bf20 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  RecValid = 0;.  
1bf30 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
1bf40 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d   = 0;.#endif.  }
1bf50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bf60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bf70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1bf80 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  E../*.** Argumen
1bf90 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c  t pIdxInfo is al
1bfa0 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
1bfb0 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
1bfc0 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a  ints that may.**
1bfd0 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
1bfe0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64  virtual table id
1bff0 65 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69  entified by pBui
1c000 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1c010 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
1c020 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65  on marks a subse
1c030 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74  t of those const
1c040 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69  raints usable, i
1c050 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42  nvokes the.** xB
1c060 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
1c070 61 6e 64 20 61 64 64 73 20 74 68 65 20 72 65 74  and adds the ret
1c080 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42  urned plan to pB
1c090 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  uilder..**.** A 
1c0a0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61  constraint is ma
1c0b0 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a  rked usable if:.
1c0c0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65  **.**   * Argume
1c0d0 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63  nt mUsable indic
1c0e0 61 74 65 73 20 74 68 61 74 20 69 74 73 20 70 72  ates that its pr
1c0f0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1c100 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a  available, and.*
1c110 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e  *.**   * It is n
1c120 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  ot one of the op
1c130 65 72 61 74 6f 72 73 20 73 70 65 63 69 66 69 65  erators specifie
1c140 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64  d in the mExclud
1c150 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a  e mask passed.**
1c160 20 20 20 20 20 61 73 20 74 68 65 20 66 6f 75 72       as the four
1c170 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69  th argument (whi
1c180 63 68 20 69 6e 20 70 72 61 63 74 69 63 65 20 69  ch in practice i
1c190 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f  s either WO_IN o
1c1a0 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  r 0)..**.** Argu
1c1b0 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20  ment mPrereq is 
1c1c0 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  a mask of tables
1c1d0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1c1e0 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1c1f0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1c200 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54  e in question. T
1c210 68 65 73 65 20 61 72 65 20 61 64 64 65 64 20 74  hese are added t
1c220 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72  o the plans prer
1c230 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66  equisites.** bef
1c240 6f 72 65 20 69 74 20 69 73 20 61 64 64 65 64 20  ore it is added 
1c250 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
1c260 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65  ** Output parame
1c270 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74  ter *pbIn is set
1c280 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
1c290 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42  plan added to pB
1c2a0 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f  uilder.** uses o
1c2b0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e  ne or more WO_IN
1c2c0 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65   terms, or false
1c2d0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1c2e0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1c2f0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1c300 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1c310 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
1c320 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1c330 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q,              
1c340 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62    /* Mask of tab
1c350 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1c360 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d   used. */.  Bitm
1c370 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20  ask mUsable,    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1c390 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61  ask of usable ta
1c3a0 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45  bles */.  u16 mE
1c3b0 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20  xclude,         
1c3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63            /* Exc
1c3d0 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67  lude terms using
1c3e0 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73   these operators
1c3f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1c400 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1c410 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  fo,   /* Populat
1c420 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42  ed object for xB
1c430 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  estIndex */.  u1
1c440 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20  6 mNoOmit,      
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c460 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65   Do not omit the
1c470 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
1c480 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20  /.  int *pbIn   
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65      /* OUT: True
1c4b0 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e   if plan uses an
1c4c0 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29   IN(...) op */.)
1c4d0 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1c4e0 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d  *pWC = pBuilder-
1c4f0 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73  >pWC;.  struct s
1c500 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1c510 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
1c520 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
1c530 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1c540 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
1c550 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
1c560 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
1c570 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1c580 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63  mxTerm;.  int rc
1c590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c5a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20  WhereLoop *pNew 
1c5b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1c5c0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1c5d0 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  e = pBuilder->pW
1c5e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1c5f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c600 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75  tem *pSrc = &pBu
1c610 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
1c620 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
1c630 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43  >iTab];.  int nC
1c640 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
1c650 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1c660 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d  t;..  assert( (m
1c670 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71  Usable & mPrereq
1c680 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20  )==mPrereq );.  
1c690 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65  *pbIn = 0;.  pNe
1c6a0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
1c6b0 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  req;..  /* Set t
1c6c0 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f  he usable flag o
1c6d0 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  n the subset of 
1c6e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e  constraints iden
1c6f0 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20  tified by .  ** 
1c700 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c  arguments mUsabl
1c710 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20  e and mExclude. 
1c720 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
1c730 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
1c740 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1c750 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
1c760 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
1c770 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1c780 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
1c790 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ons++){.    Wher
1c7a0 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
1c7b0 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d  pWC->a[pIdxCons-
1c7c0 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20  >iTermOffset];. 
1c7d0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
1c7e0 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1c7f0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
1c800 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d  ight & mUsable)=
1c810 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  =pTerm->prereqRi
1c820 67 68 74 20 0a 20 20 20 20 20 26 26 20 28 70 54  ght .     && (pT
1c830 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1c840 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20   mExclude)==0.  
1c850 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43    ){.      pIdxC
1c860 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
1c870 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c880 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1c890 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66  output fields of
1c8a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
1c8b0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
1c8c0 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55  e */.  memset(pU
1c8d0 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
1c8e0 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73  pUsage[0])*nCons
1c8f0 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  traint);.  asser
1c900 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  t( pIdxInfo->nee
1c910 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
1c920 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   );.  pIdxInfo->
1c930 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
1c940 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
1c950 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1c960 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
1c970 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1c980 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
1c990 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
1c9a0 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70  / (double)2;.  p
1c9b0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1c9c0 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70  edRows = 25;.  p
1c9d0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1c9e0 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  s = 0;.  pIdxInf
1c9f0 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71  o->colUsed = (sq
1ca00 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63  lite3_int64)pSrc
1ca10 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a  ->colUsed;..  /*
1ca20 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74   Invoke the virt
1ca30 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49  ual table xBestI
1ca40 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f  ndex() method */
1ca50 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74  .  rc = vtabBest
1ca60 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 53  Index(pParse, pS
1ca70 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e  rc->pTab, pIdxIn
1ca80 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  fo);.  if( rc ){
1ca90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1caa0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
1cab0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1cac0 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
1cad0 68 6f 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hod returns SQLI
1cae0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
1caf0 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 20 20  hat means.      
1cb00 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 72 74  ** that the part
1cb10 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1cb20 6f 6e 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  on of parameters
1cb30 20 70 72 6f 76 69 64 65 64 20 69 73 20 75 6e 75   provided is unu
1cb40 73 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  sable..      ** 
1cb50 4d 61 6b 65 20 6e 6f 20 65 6e 74 72 69 65 73 20  Make no entries 
1cb60 69 6e 20 74 68 65 20 6c 6f 6f 70 20 74 61 62 6c  in the loop tabl
1cb70 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1cb80 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
1cb90 66 66 66 2c 20 28 22 20 20 5e 5e 5e 5e 2d 2d 2d  fff, ("  ^^^^---
1cba0 20 6e 6f 6e 2d 76 69 61 62 6c 65 20 70 6c 61 6e   non-viable plan
1cbb0 20 72 65 6a 65 63 74 65 64 21 5c 6e 22 29 29 3b   rejected!\n"));
1cbc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cbd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1cbe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cbf0 7d 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  }..  mxTerm = -1
1cc00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
1cc10 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
1cc20 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69  raint );.  for(i
1cc30 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1cc40 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c  t; i++) pNew->aL
1cc50 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70  Term[i] = 0;.  p
1cc60 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
1cc70 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78  Mask = 0;.  pIdx
1cc80 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
1cc90 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1cca0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
1ccb0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1ccc0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
1ccd0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1cce0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
1ccf0 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
1cd00 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
1cd10 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
1cd20 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
1cd30 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1cd40 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
1cd50 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
1cd60 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
1cd70 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
1cd80 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c  straint.       |
1cd90 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20  | j<0.       || 
1cda0 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
1cdb0 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
1cdc0 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
1cdd0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e        || pIdxCon
1cde0 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20  s->usable==0.   
1cdf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1ce00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ce10 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e  arse,"%s.xBestIn
1ce20 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  dex malfunction"
1ce30 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61  ,pSrc->pTab->zNa
1ce40 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  me);.        tes
1ce50 74 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f 2d  tcase( pIdxInfo-
1ce60 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1ce70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r );.        ret
1ce80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1ce90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cea0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
1ceb0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
1cec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ced0 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
1cee0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
1cef0 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
1cf00 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
1cf10 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65  >a[j];.      pNe
1cf20 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
1cf30 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
1cf40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1cf50 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
1cf60 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
1cf70 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
1cf80 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   pTerm;.      if
1cf90 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
1cfa0 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
1cfb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cfc0 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
1cfd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1cfe0 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
1cff0 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
1d000 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
1d010 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
1d020 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
1d030 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  erm;.      if( (
1d040 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1d050 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
1d060 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
1d070 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
1d080 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
1d090 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
1d0a0 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  ay not.        *
1d0b0 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52  * consume the OR
1d0c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65  DER BY clause be
1d0d0 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72  cause (1) the or
1d0e0 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a  der of IN terms.
1d0f0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
1d100 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
1d110 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
1d120 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
1d130 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  ms and.        *
1d140 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
1d150 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
1d160 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
1d170 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
1d180 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
1d190 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49  .  */.        pI
1d1a0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1d1b0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
1d1c0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69       pIdxInfo->i
1d1d0 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  dxFlags &= ~SQLI
1d1e0 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
1d1f0 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70  IQUE;.        *p
1d200 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28  bIn = 1; assert(
1d210 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f   (mExclude & WO_
1d220 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  IN)==0 );.      
1d230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  }.    }.  }.  pN
1d240 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
1d250 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b  ask &= ~mNoOmit;
1d260 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ..  pNew->nLTerm
1d270 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 66   = mxTerm+1;.  f
1d280 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 54 65 72  or(i=0; i<=mxTer
1d290 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
1d2a0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
1d2b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1d2c0 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 61 72 67  The non-zero arg
1d2d0 76 49 64 78 20 76 61 6c 75 65 73 20 6d 75 73 74  vIdx values must
1d2e0 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 20   be contiguous. 
1d2f0 20 52 61 69 73 65 20 61 6e 0a 20 20 20 20 20 20   Raise an.      
1d300 2a 2a 20 65 72 72 6f 72 20 69 66 20 74 68 65 79  ** error if they
1d310 20 61 72 65 20 6e 6f 74 20 2a 2f 0a 20 20 20 20   are not */.    
1d320 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1d330 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65  g(pParse,"%s.xBe
1d340 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74  stIndex malfunct
1d350 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d  ion",pSrc->pTab-
1d360 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 74  >zName);.      t
1d370 65 73 74 63 61 73 65 28 20 70 49 64 78 49 6e 66  estcase( pIdxInf
1d380 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1d390 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
1d3a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1d3b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1d3c0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
1d3d0 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
1d3e0 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   );.  pNew->u.vt
1d3f0 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
1d400 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
1d410 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1d420 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
1d430 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1d440 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  tr;.  pIdxInfo->
1d450 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1d460 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1d470 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
1d480 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
1d490 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1d4a0 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
1d4b0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1d4c0 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
1d4d0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
1d4e0 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65  erBy : 0);.  pNe
1d4f0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1d500 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1d510 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
1d520 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
1d530 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
1d540 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1d550 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1d560 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1d570 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Rows);..  /* Set
1d580 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1d590 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42  W flag if the xB
1d5a0 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1d5b0 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a  d indicated.  **
1d5c0 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
1d5d0 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73  ill visit at mos
1d5e0 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72  t one row. Clear
1d5f0 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a   it otherwise. *
1d600 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  /.  if( pIdxInfo
1d610 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c  ->idxFlags & SQL
1d620 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1d630 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65  NIQUE ){.    pNe
1d640 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1d650 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65  ERE_ONEROW;.  }e
1d660 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  lse{.    pNew->w
1d670 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1d680 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  _ONEROW;.  }.  r
1d690 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1d6a0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1d6b0 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ew);.  if( pNew-
1d6c0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1d6d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1d6e0 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1d6f0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  b.idxStr);.    p
1d700 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1d710 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
1d720 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
1d730 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72  f, ("  bIn=%d pr
1d740 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72  ereqIn=%04llx pr
1d750 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e  ereqOut=%04llx\n
1d760 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d770 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20           *pbIn, 
1d780 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1d790 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  mPrereq,.       
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d7b0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28  sqlite3_uint64)(
1d7c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1d7d0 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72  mPrereq)));..  r
1d7e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d7f0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
1d800 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 66  ion is invoked f
1d810 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 78 42  rom within an xB
1d820 65 73 74 49 6e 64 65 78 28 29 20 63 61 6c 6c 62  estIndex() callb
1d830 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75 72  ack, it.** retur
1d840 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1d850 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1d860 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
1d870 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  the collation.**
1d880 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69   sequence associ
1d890 61 74 65 64 20 77 69 74 68 20 65 6c 65 6d 65 6e  ated with elemen
1d8a0 74 20 69 43 6f 6e 73 20 6f 66 20 74 68 65 20 73  t iCons of the s
1d8b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1d8c0 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  o.aConstraint.**
1d8d0 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 69   array. Or, if i
1d8e0 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66 20 72  Cons is out of r
1d8f0 61 6e 67 65 20 6f 72 20 74 68 65 72 65 20 69 73  ange or there is
1d900 20 6e 6f 20 61 63 74 69 76 65 20 78 42 65 73 74   no active xBest
1d910 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72  Index.** call, r
1d920 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  eturn NULL..*/.c
1d930 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1d940 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f  e3_vtab_collatio
1d950 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n(sqlite3_index_
1d960 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20  info *pIdxInfo, 
1d970 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20 48 69  int iCons){.  Hi
1d980 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70  ddenIndexInfo *p
1d990 48 69 64 64 65 6e 20 3d 20 28 48 69 64 64 65 6e  Hidden = (Hidden
1d9a0 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78  IndexInfo*)&pIdx
1d9b0 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74  Info[1];.  const
1d9c0 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
1d9d0 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20  .  if( iCons>=0 
1d9e0 26 26 20 69 43 6f 6e 73 3c 70 49 64 78 49 6e 66  && iCons<pIdxInf
1d9f0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  o->nConstraint )
1da00 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
1da10 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  C = 0;.    int i
1da20 54 65 72 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Term = pIdxInfo-
1da30 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 43 6f  >aConstraint[iCo
1da40 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns].iTermOffset;
1da50 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
1da60 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e 61 5b  pHidden->pWC->a[
1da70 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
1da80 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 20    if( pX->pLeft 
1da90 29 7b 0a 20 20 20 20 20 20 70 43 20 3d 20 73 71  ){.      pC = sq
1daa0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1dab0 72 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64 65  reCollSeq(pHidde
1dac0 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  n->pParse, pX->p
1dad0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
1dae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  );.    }.    zRe
1daf0 74 20 3d 20 28 70 43 20 3f 20 70 43 2d 3e 7a 4e  t = (pC ? pC->zN
1db00 61 6d 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72  ame : sqlite3Str
1db10 42 49 4e 41 52 59 29 3b 0a 20 20 7d 0a 20 20 72  BINARY);.  }.  r
1db20 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
1db30 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
1db40 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
1db50 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
1db60 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
1db70 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
1db80 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
1db90 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
1dba0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
1dbb0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
1dbc0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
1dbd0 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f  e no LEFT or CRO
1dbe0 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e  SS JOIN joins in
1dbf0 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68   the query, both
1dc00 20 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20   mPrereq and.** 
1dc10 6d 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65  mUnusable are se
1dc20 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73  t to 0. Otherwis
1dc30 65 2c 20 6d 50 72 65 72 65 71 20 69 73 20 61 20  e, mPrereq is a 
1dc40 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  mask of all FROM
1dc50 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69   clause.** entri
1dc60 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
1dc70 66 6f 72 65 20 74 68 65 20 76 69 72 74 75 61 6c  fore the virtual
1dc80 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
1dc90 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72  OM clause and ar
1dca0 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66  e.** separated f
1dcb0 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
1dcc0 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43  st one LEFT or C
1dcd0 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c  ROSS JOIN. Simil
1dce0 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e  arly, the.** mUn
1dcf0 75 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74  usable mask cont
1dd00 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  ains all FROM cl
1dd10 61 75 73 65 20 65 6e 74 72 69 65 73 20 74 68 61  ause entries tha
1dd20 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68  t occur after th
1dd30 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  e.** virtual tab
1dd40 6c 65 20 61 6e 64 20 61 72 65 20 73 65 70 61 72  le and are separ
1dd50 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20  ated from it by 
1dd60 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46  at least one LEF
1dd70 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a  T or .** CROSS J
1dd80 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  OIN. .**.** For 
1dd90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1dda0 71 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a  query were:.**.*
1ddb0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c  *   ... FROM t1,
1ddc0 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33   t2 LEFT JOIN t3
1ddd0 2c 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a  , t4, vt CROSS J
1dde0 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a  OIN t5, t6;.**.*
1ddf0 2a 20 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63  * then mPrereq c
1de00 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74  orresponds to (t
1de10 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73  1, t2) and mUnus
1de20 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29  able to (t5, t6)
1de30 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20  ..**.** All the 
1de40 74 61 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65  tables in mPrere
1de50 71 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  q must be scanne
1de60 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  d before the cur
1de70 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a  rent virtual .**
1de80 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74   table. So any t
1de90 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61  erms for which a
1dea0 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ll prerequisites
1deb0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
1dec0 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61  y .** mPrereq ma
1ded0 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61  y be specified a
1dee0 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c  s "usable" in al
1def0 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  l calls to xBest
1df00 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65  Index. .** Conve
1df10 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65  rsely, all table
1df20 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d  s in mUnusable m
1df30 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61  ust be scanned a
1df40 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
1df50 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1df60 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20  e, so any terms 
1df70 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72  for which the pr
1df80 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72  erequisites over
1df90 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75  lap with.** mUnu
1dfa0 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77  sable should alw
1dfb0 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65  ays be configure
1dfc0 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65  d as "not-usable
1dfd0 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78  " for xBestIndex
1dfe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dff0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1e000 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
1e010 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1e020 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
1e030 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
1e040 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  */.  Bitmask mPr
1e050 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20  ereq,           
1e060 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
1e070 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1e080 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65   before this one
1e090 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1e0a0 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20  nusable         
1e0b0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
1e0c0 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
1e0d0 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65  d after this one
1e0e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1e0f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1e100 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e110 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49  code */.  WhereI
1e120 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
1e130 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
1e140 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
1e150 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
1e160 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1e170 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1e180 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1e190 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e1b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e1c0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1e1d0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
1e1e0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1e1f0 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
1e200 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rch */.  sqlite3
1e210 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20  _index_info *p; 
1e220 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
1e230 74 6f 20 70 61 73 73 20 74 6f 20 78 42 65 73 74  to pass to xBest
1e240 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74  Index() */.  int
1e250 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
1e260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e270 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
1e280 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74  ts in p */.  int
1e290 20 62 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   bIn;           
1e2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e2b0 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49  e if plan uses I
1e2c0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
1e2d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1e2e0 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20  pNew;.  Bitmask 
1e2f0 6d 42 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  mBest;          
1e300 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75       /* Tables u
1e310 73 65 64 20 62 79 20 62 65 73 74 20 70 6f 73 73  sed by best poss
1e320 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75  ible plan */.  u
1e330 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61  16 mNoOmit;..  a
1e340 73 73 65 72 74 28 20 28 6d 50 72 65 72 65 71 20  ssert( (mPrereq 
1e350 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20  & mUnusable)==0 
1e360 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  );.  pWInfo = pB
1e370 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1e380 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1e390 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 57 43  o->pParse;.  pWC
1e3a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1e3b0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
1e3c0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
1e3d0 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
1e3e0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
1e3f0 54 61 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  Tab];.  assert( 
1e400 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
1e410 70 54 61 62 29 20 29 3b 0a 20 20 70 20 3d 20 61  pTab) );.  p = a
1e420 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
1e430 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55  (pParse, pWC, mU
1e440 6e 75 73 61 62 6c 65 2c 20 70 53 72 63 2c 20 70  nusable, pSrc, p
1e450 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
1e460 79 2c 20 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d  y, .      &mNoOm
1e470 69 74 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  it);.  if( p==0 
1e480 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e490 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e  NOMEM_BKPT;.  pN
1e4a0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1e4b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1e4c0 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
1e4d0 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
1e4e0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
1e4f0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1e500 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72  e = 0;.  nConstr
1e510 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74  aint = p->nConst
1e520 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65  raint;.  if( whe
1e530 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61  reLoopResize(pPa
1e540 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e  rse->db, pNew, n
1e550 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
1e560 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e570 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b  (pParse->db, p);
1e580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e590 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1e5a0 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
1e5b0 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 28 29  all xBestIndex()
1e5c0 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72   with all constr
1e5d0 61 69 6e 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f  aints usable. */
1e5e0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1e5f0 38 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e  800, ("BEGIN %s.
1e600 61 64 64 56 69 72 74 75 61 6c 28 29 5c 6e 22 2c  addVirtual()\n",
1e610 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
1e620 6d 65 29 29 3b 0a 20 20 57 48 45 52 45 54 52 41  me));.  WHERETRA
1e630 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1e640 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61  tualOne: all usa
1e650 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d  ble\n"));.  rc =
1e660 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1e670 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1e680 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49  , mPrereq, ALLBI
1e690 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  TS, 0, p, mNoOmi
1e6a0 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20  t, &bIn);..  /* 
1e6b0 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
1e6c0 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68  BestIndex() with
1e6d0 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c   all terms enabl
1e6e0 65 64 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c  ed produced a pl
1e6f0 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  an.  ** that doe
1e700 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
1e710 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  y source tables 
1e720 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74  (IOW: a plan wit
1e730 68 20 6d 42 65 73 74 3d 3d 30 29 0a 20 20 2a 2a  h mBest==0).  **
1e740 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73   and does not us
1e750 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  e an IN(...) ope
1e760 72 61 74 6f 72 2c 20 74 68 65 6e 20 74 68 65 72  rator, then ther
1e770 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1e780 20 6d 61 6b 69 6e 67 20 0a 20 20 2a 2a 20 61 6e   making .  ** an
1e790 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  y further calls 
1e7a0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1e7b0 73 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20  since they will 
1e7c0 61 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73  all return the s
1e7d0 61 6d 65 0a 20 20 2a 2a 20 72 65 73 75 6c 74 20  ame.  ** result 
1e7e0 28 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64  (if the xBestInd
1e7f0 65 78 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ex() implementat
1e800 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f  ion is sane). */
1e810 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e820 45 5f 4f 4b 20 26 26 20 28 28 6d 42 65 73 74 20  E_OK && ((mBest 
1e830 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  = (pNew->prereq 
1e840 26 20 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20  & ~mPrereq))!=0 
1e850 7c 7c 20 62 49 6e 29 20 29 7b 0a 20 20 20 20 69  || bIn) ){.    i
1e860 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b  nt seenZero = 0;
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e880 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77  True if a plan w
1e890 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73  ith no prereqs s
1e8a0 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  een */.    int s
1e8b0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b  eenZeroNoIN = 0;
1e8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e           /* Plan
1e8d0 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73   with no prereqs
1e8e0 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20   and no IN(...) 
1e8f0 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d  seen */.    Bitm
1e900 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20  ask mPrev = 0;. 
1e910 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74     Bitmask mBest
1e920 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  NoIn = 0;..    /
1e930 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72  * If the plan pr
1e940 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65 61  oduced by the ea
1e950 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20  rlier call uses 
1e960 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c  an IN(...) term,
1e970 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65   call.    ** xBe
1e980 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74  stIndex again, t
1e990 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e  his time with IN
1e9a0 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61  (...) terms disa
1e9b0 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  bled. */.    if(
1e9c0 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48   bIn ){.      WH
1e9d0 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1e9e0 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1e9f0 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e  ll usable w/o IN
1ea00 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1ea10 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1ea20 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1ea30 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1ea40 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20  rereq, ALLBITS, 
1ea50 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  WO_IN, p, mNoOmi
1ea60 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1ea70 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20 29  assert( bIn==0 )
1ea80 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49  ;.      mBestNoI
1ea90 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  n = pNew->prereq
1eaa0 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20   & ~mPrereq;.   
1eab0 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e     if( mBestNoIn
1eac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1ead0 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20  eenZero = 1;.   
1eae0 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49       seenZeroNoI
1eaf0 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  N = 1;.      }. 
1eb00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c     }..    /* Cal
1eb10 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e 63  l xBestIndex onc
1eb20 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 69  e for each disti
1eb30 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70 72  nct value of (pr
1eb40 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72  ereqRight & ~mPr
1eb50 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e  ereq) .    ** in
1eb60 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d   the set of term
1eb70 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
1eb80 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1eb90 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ual table.  */. 
1eba0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1ebb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ebc0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69   int i;.      Bi
1ebd0 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c  tmask mNext = AL
1ebe0 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73 73  LBITS;.      ass
1ebf0 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a  ert( mNext>0 );.
1ec00 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1ec10 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1ec20 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  +){.        Bitm
1ec30 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20 20  ask mThis = (.  
1ec40 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61            pWC->a
1ec50 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  [p->aConstraint[
1ec60 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e  i].iTermOffset].
1ec70 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d  prereqRight & ~m
1ec80 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 29  Prereq.        )
1ec90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
1eca0 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54 68  his>mPrev && mTh
1ecb0 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74  is<mNext ) mNext
1ecc0 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20 20   = mThis;.      
1ecd0 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d 20  }.      mPrev = 
1ece0 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28  mNext;.      if(
1ecf0 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20   mNext==ALLBITS 
1ed00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
1ed10 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20  f( mNext==mBest 
1ed20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e  || mNext==mBestN
1ed30 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oIn ) continue;.
1ed40 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1ed50 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1ed60 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34  alOne: mPrev=%04
1ed70 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78  llx mNext=%04llx
1ed80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1eda0 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65  ite3_uint64)mPre
1edb0 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  v, (sqlite3_uint
1edc0 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20  64)mNext));.    
1edd0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1ede0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1edf0 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1ee00 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78  r, mPrereq, mNex
1ee10 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  t|mPrereq, 0, p,
1ee20 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1ee30 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
1ee40 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71  >prereq==mPrereq
1ee50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1ee60 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1ee70 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1ee80 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1ee90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1eea0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1eeb0 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1eec0 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65  x() in the above
1eed0 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69   loop did not fi
1eee0 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1eef0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1ef00 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1ef10 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65  at all (i.e. one
1ef20 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1ef30 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29  e.    ** usable)
1ef40 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65  , make a call he
1ef50 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72  re with all sour
1ef60 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c  ce tables disabl
1ef70 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ed */.    if( rc
1ef80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1ef90 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20  eenZero==0 ){.  
1efa0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1efb0 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1efc0 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1efd0 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  d\n"));.      rc
1efe0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1eff0 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1f000 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1f010 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c  Prereq, mPrereq,
1f020 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1f030 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &bIn);.      if(
1f040 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65   bIn==0 ) seenZe
1f050 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1f060 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1f070 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1f080 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20 66  ndex() have so f
1f090 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e  ar failed to fin
1f0a0 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  d a plan.    ** 
1f0b0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f  that requires no
1f0c0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61   source tables a
1f0d0 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e  t all and does n
1f0e0 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e  ot use an IN(...
1f0f0 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ).    ** operato
1f100 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20  r, make a final 
1f110 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f  call to obtain o
1f120 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20  ne here.  */.   
1f130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f140 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f  OK && seenZeroNo
1f150 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  IN==0 ){.      W
1f160 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1f170 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1f180 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e 64  all disabled and
1f190 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20   w/o IN\n"));.  
1f1a0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1f1b0 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1f1c0 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c  .          pBuil
1f1d0 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50  der, mPrereq, mP
1f1e0 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c  rereq, WO_IN, p,
1f1f0 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1f200 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1f210 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  ( p->needToFreeI
1f220 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
1f230 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b  free(p->idxStr);
1f240 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f250 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  NN(pParse->db, p
1f260 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
1f270 30 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73 2e  0x800, ("END %s.
1f280 61 64 64 56 69 72 74 75 61 6c 28 29 2c 20 72 63  addVirtual(), rc
1f290 3d 25 64 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54  =%d\n", pSrc->pT
1f2a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b  ab->zName, rc));
1f2b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f2c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1f2d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1f2e0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
1f2f0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
1f300 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
1f310 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
1f320 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
1f330 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
1f340 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
1f350 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1f360 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65  opAddOr(.  Where
1f370 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1f380 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73  ilder, .  Bitmas
1f390 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69  k mPrereq, .  Bi
1f3a0 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a  tmask mUnusable.
1f3b0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1f3c0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1f3d0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65  r->pWInfo;.  Whe
1f3e0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
1f3f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
1f400 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
1f410 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
1f420 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f430 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
1f440 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
1f450 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
1f460 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
1f470 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65  ild;.  WhereOrSe
1f480 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20  t sSum, sCur;.  
1f490 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f4a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
1f4b0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1f4c0 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d  >pWC;.  pWCEnd =
1f4d0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
1f4e0 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
1f4f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1f500 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
1f510 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
1f520 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
1f530 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
1f540 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
1f550 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
1f560 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65  rsor;..  for(pTe
1f570 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
1f580 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
1f590 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
1f5a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
1f5b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1f5c0 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
1f5d0 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
1f5e0 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
1f5f0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
1f600 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
1f610 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
1f620 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
1f630 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1f640 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
1f650 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
1f660 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
1f670 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
1f680 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1f690 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
1f6a0 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
1f6b0 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
1f6c0 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75     .      sSubBu
1f6d0 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
1f6e0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1f6f0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
1f700 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1f710 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
1f720 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1f730 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20  (0x200, ("Begin 
1f740 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c  processing OR-cl
1f750 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72  ause %p\n", pTer
1f760 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  m));.      for(p
1f770 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
1f780 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
1f790 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
1f7a0 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
1f7b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1f7c0 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
1f7d0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1f7e0 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
1f7f0 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
1f800 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
1f810 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
1f820 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
1f830 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
1f840 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
1f850 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
1f860 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
1f870 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
1f880 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
1f890 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
1f8a0 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
1f8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1f8c0 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
1f8d0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
1f8e0 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
1f8f0 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
1f900 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
1f910 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
1f920 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
1f930 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45   0;.#ifdef WHERE
1f940 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
1f950 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1f960 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72  (0x200, ("OR-ter
1f970 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25  m %d of %p has %
1f980 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20  d subterms:\n", 
1f990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9a0 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72      (int)(pOrTer
1f9b0 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65  m-pOrWC->a), pTe
1f9c0 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57  rm, sSubBuild.pW
1f9d0 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20  C->nTerm));.    
1f9e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
1f9f0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30  hereTrace & 0x40
1fa00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1fa10 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
1fa20 65 50 72 69 6e 74 28 73 53 75 62 42 75 69 6c 64  ePrint(sSubBuild
1fa30 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  .pWC);.        }
1fa40 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1fa50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1fa60 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
1fa70 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1fa80 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
1fa90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1faa0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1fab0 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50  l(&sSubBuild, mP
1fac0 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65  rereq, mUnusable
1fad0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1fae0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1faf0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1fb00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1fb10 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  ee(&sSubBuild, m
1fb20 50 72 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20  Prereq);.       
1fb30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1fb40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fb50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1fb60 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73  hereLoopAddOr(&s
1fb70 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1fb80 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1fb90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fba0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1fbb0 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
1fbc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
1fbd0 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
1fbe0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1fbf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1fc00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1fc10 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
1fc20 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1fc30 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
1fc40 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
1fc50 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
1fc60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fc70 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50     WhereOrSet sP
1fc80 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77  rev;.          w
1fc90 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
1fca0 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
1fcb0 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
1fcc0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1fcd0 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
1fce0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1fcf0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
1fd00 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
1fd10 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
1fd20 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
1fd30 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
1fd40 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
1fd50 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1fd70 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1fd80 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
1fd90 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
1fda0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1fdc0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1fdd0 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
1fde0 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
1fdf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1fe00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fe10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fe20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
1fe30 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
1fe40 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
1fe50 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
1fe60 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1fe70 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
1fe80 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1fe90 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
1fea0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
1feb0 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
1fec0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
1fed0 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
1fee0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1fef0 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
1ff00 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1ff10 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72   /* TUNING: Curr
1ff20 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e  ently sSum.a[i].
1ff30 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74  rRun is set to t
1ff40 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f  he sum of the co
1ff50 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  sts.        ** o
1ff60 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20  f all sub-scans 
1ff70 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1ff80 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72  OR-scan. However
1ff90 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e  , due to roundin
1ffa0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  g.        ** err
1ffb0 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74  ors, it may be t
1ffc0 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
1ffd0 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65  the OR-scan is e
1ffe0 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20  qual to its.    
1fff0 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65      ** most expe
20000 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20  nsive sub-scan. 
20010 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  Add the smallest
20020 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74   possible penalt
20030 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  y .        ** (e
20040 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c  quivalent to mul
20050 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73  tiplying the cos
20060 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e  t by 1.07) to en
20070 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20  sure that .     
20080 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20     ** this does 
20090 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65  not happen. Othe
200a0 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45  rwise, for WHERE
200b0 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73   clauses such as
200c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
200d0 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20  following where 
200e0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
200f0 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20  x on "y":.      
20100 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20110 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69      WHERE likeli
20120 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20  hood(x=?, 0.99) 
20130 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a  OR y=?.        *
20140 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
20150 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65   planner may ele
20160 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74  ct to "OR" toget
20170 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65  her a full-table
20180 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20   scan and an.   
20190 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f       ** index lo
201a0 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20  okup. And other 
201b0 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65  similarly odd re
201c0 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  sults.  */.     
201d0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
201e0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
201f0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
20200 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
20210 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
20220 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
20230 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
20240 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
20250 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
20260 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
20270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
20280 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
20290 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67  ("End processing
202a0 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
202b0 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d  , pTerm));.    }
202c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
202d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
202e0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
202f0 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
20300 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
20310 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
20320 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
20330 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
20340 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
20350 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
20360 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
20370 6b 20 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20  k mPrereq = 0;. 
20380 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
20390 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
203a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
203b0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
203c0 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
203d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
203e0 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20  pItem;.  struct 
203f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45  SrcList_item *pE
20400 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  nd = &pTabList->
20410 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
20420 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ];.  sqlite3 *db
20430 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
20440 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  e->db;.  int rc 
20450 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
20460 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
20470 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79    u8 priorJointy
20480 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f  pe = 0;..  /* Lo
20490 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
204a0 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
204b0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
204c0 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
204d0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
204e0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
204f0 4e 65 77 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  New);.  pBuilder
20500 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 20 3d 20 53  ->iPlanLimit = S
20510 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41 4e  QLITE_QUERY_PLAN
20520 4e 45 52 5f 4c 49 4d 49 54 3b 0a 20 20 66 6f 72  NER_LIMIT;.  for
20530 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
20540 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65  TabList->a; pIte
20550 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20  m<pEnd; iTab++, 
20560 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69  pItem++){.    Bi
20570 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
20580 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
20590 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
205a0 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c  pBuilder->iPlanL
205b0 69 6d 69 74 20 2b 3d 20 53 51 4c 49 54 45 5f 51  imit += SQLITE_Q
205c0 55 45 52 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d  UERY_PLANNER_LIM
205d0 49 54 5f 49 4e 43 52 3b 0a 20 20 20 20 70 4e 65  IT_INCR;.    pNe
205e0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71  w->maskSelf = sq
205f0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
20600 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
20610 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
20620 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
20630 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
20640 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65  pe|priorJointype
20650 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
20660 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
20670 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64      /* This cond
20680 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77 68  ition is true wh
20690 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65 20  en pItem is the 
206a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
206b0 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
206c0 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65   right-hand-side
206d0 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43 52   of a LEFT or CR
206e0 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20  OSS JOIN.  */.  
206f0 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d 50      mPrereq = mP
20700 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
20710 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
20720 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
20730 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  pe;.#ifndef SQLI
20740 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
20750 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56  ABLE.    if( IsV
20760 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
20770 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ab) ){.      str
20780 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20790 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
207a0 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45  =&pItem[1]; p<pE
207b0 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
207c0 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20    if( mUnusable 
207d0 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79  || (p->fg.jointy
207e0 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
207f0 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20  _CROSS)) ){.    
20800 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20        mUnusable 
20810 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47  |= sqlite3WhereG
20820 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
20830 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75  sMaskSet, p->iCu
20840 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rsor);.        }
20850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
20860 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
20870 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
20880 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
20890 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
208a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
208b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
208c0 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20  BLE */.    {.   
208d0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
208e0 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64  pAddBtree(pBuild
208f0 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20  er, mPrereq);.  
20900 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
20910 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 42 75  SQLITE_OK && pBu
20920 69 6c 64 65 72 2d 3e 70 57 43 2d 3e 68 61 73 4f  ilder->pWC->hasO
20930 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
20940 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70  whereLoopAddOr(p
20950 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
20960 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
20970 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
20980 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
20990 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
209a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
209b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
209c0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
209d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
209e0 69 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  it the query pla
209f0 6e 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69  nner search limi
20a00 74 20 73 65 74 20 62 79 20 69 50 6c 61 6e 4c 69  t set by iPlanLi
20a10 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  mit */.        s
20a20 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
20a30 45 5f 57 41 52 4e 49 4e 47 2c 20 22 61 62 62 72  E_WARNING, "abbr
20a40 65 76 69 61 74 65 64 20 71 75 65 72 79 20 61 6c  eviated query al
20a50 67 6f 72 69 74 68 6d 20 73 65 61 72 63 68 22 29  gorithm search")
20a60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
20a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
20a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
20a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
20aa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65    }.  }..  where
20ab0 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e  LoopClear(db, pN
20ac0 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ew);.  return rc
20ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69  ;.}../*.** Exami
20ae0 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28  ne a WherePath (
20af0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
20b00 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57  n of the extra W
20b10 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20  hereLoop of the 
20b20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  6th.** parameter
20b30 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  s) to see if it 
20b40 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
20b50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52  the requested OR
20b60 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52  DER BY.** (or GR
20b70 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20  OUP BY) without 
20b80 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61  requiring a sepa
20b90 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74  rate sort operat
20ba0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a  ion.  Return N:.
20bb0 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20  ** .**   N>0:   
20bc0 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  N terms of the O
20bd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
20be0 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
20bf0 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d    N==0:  No term
20c00 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
20c10 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
20c20 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a  isfied.**   N<0:
20c30 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68     Unknown yet h
20c40 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66  ow many terms of
20c50 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20   ORDER BY might 
20c60 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  be satisfied.   
20c70 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20c80 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
20c90 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e  WHERE_GROUPBY an
20ca0 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  d WHERE_DISTINCT
20cb0 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20  BY is not as.** 
20cc0 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52  strict.  With GR
20cd0 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
20ce0 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71  NCT the only req
20cf0 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74  uirement is that
20d00 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72  .** equivalent r
20d10 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64  ows appear immed
20d20 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20  iately adjacent 
20d30 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20  to one another. 
20d40 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64   GROUP BY.** and
20d50 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74   DISTINCT do not
20d60 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
20d70 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
20d80 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
20d90 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
20da0 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivalent rows ar
20db0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
20dc0 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
20dd0 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
20de0 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
20df0 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
20e00 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
20e10 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
20e20 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
20e30 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
20e40 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
20e50 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
20e60 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
20e70 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50  static i8 whereP
20e80 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
20e90 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
20ea0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
20eb0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
20ec0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
20ed0 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
20ee0 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
20ef0 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
20f00 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
20f10 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
20f20 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
20f30 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
20f40 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
20f50 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
20f60 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  /* WHERE_GROUPBY
20f70 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20   or _DISTINCTBY 
20f80 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  or _ORDERBY_LIMI
20f90 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  T */.  u16 nLoop
20fa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20fb0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
20fc0 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
20fd0 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
20fe0 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
20ff0 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
21000 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
21010 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
21020 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
21030 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
21040 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
21050 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
21060 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
21070 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
21080 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
21090 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
210a0 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
210b0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
210c0 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
210d0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
210e0 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
210f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
21100 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
21110 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
21120 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
21130 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
21140 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
21150 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
21160 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
21170 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
21180 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
21190 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
211a0 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
211b0 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
211c0 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
211d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
211e0 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71  ause */.  u16 eq
211f0 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  OpMask;         
21200 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c  /* Allowed equal
21210 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
21220 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20  .  u16 nKeyCol; 
21230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21240 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
21250 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
21260 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
21270 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
21280 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65  number of ordere
21290 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
212a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
212b0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
212c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
212d0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
212e0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
212f0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
21300 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
21310 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
21320 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
21330 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
21340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21350 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
21360 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
21370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
21380 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
21390 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
213a0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
213b0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
213c0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
213d0 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
213e0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
213f0 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
21400 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
21410 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
21420 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
21430 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
21440 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
21450 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21460 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
21470 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
21480 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
21490 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
214a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
214b0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
214c0 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
214d0 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
214e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
214f0 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
21500 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
21510 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
21520 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
21530 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
21540 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
21550 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
21560 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21570 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
21580 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
21590 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
215a0 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
215b0 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
215c0 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
215d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
215e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
215f0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
21600 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
21610 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
21620 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
21630 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
21640 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
21650 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
21660 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
21670 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
21680 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
21690 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
216a0 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
216b0 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
216c0 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
216d0 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
216e0 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
216f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21700 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
21710 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
21720 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
21730 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
21740 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
21750 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
21760 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
21770 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
21780 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
21790 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
217a0 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
217b0 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
217c0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
217d0 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
217e0 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
217f0 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
21800 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
21810 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
21820 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
21830 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
21840 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
21850 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
21860 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
21870 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
21880 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
21890 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
218a0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
218b0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
218c0 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
218d0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
218e0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
218f0 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
21900 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
21910 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
21920 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
21930 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
21940 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
21950 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
21960 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
21970 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
21980 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
21990 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
219a0 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
219b0 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
219c0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
219d0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
219e0 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
219f0 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
21a00 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
21a10 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
21a20 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
21a30 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
21a40 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
21a50 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
21a60 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
21a70 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
21a80 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
21a90 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
21aa0 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
21ab0 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
21ac0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
21ad0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
21ae0 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
21af0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
21b00 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
21b10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
21b20 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69  rderBy!=0 );.  i
21b30 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
21b40 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
21b50 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
21b60 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
21b70 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
21b80 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
21b90 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
21ba0 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
21bb0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
21bc0 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
21bd0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
21be0 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
21bf0 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
21c00 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
21c10 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
21c20 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
21c30 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
21c40 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
21c50 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
21c60 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57  ;.  eqOpMask = W
21c70 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57  O_EQ | WO_IS | W
21c80 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20  O_ISNULL;.  if( 
21c90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21ca0 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
21cb0 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57   ) eqOpMask |= W
21cc0 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f  O_IN;.  for(iLoo
21cd0 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
21ce0 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
21cf0 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
21d00 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
21d10 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
21d20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
21d30 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
21d40 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  if( iLoop<nLoop 
21d50 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  ){.      pLoop =
21d60 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
21d70 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  oop];.      if( 
21d80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21d90 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
21da0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
21dc0 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20  oop = pLast;.   
21dd0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
21de0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21df0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
21e00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
21e10 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  p->u.vtab.isOrde
21e20 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62  red ) obSat = ob
21e30 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61  Done;.      brea
21e40 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
21e50 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21e60 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
21e70 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  {.      pLoop->u
21e80 2e 62 74 72 65 65 2e 6e 44 69 73 74 69 6e 63 74  .btree.nDistinct
21e90 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
21ea0 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
21eb0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
21ec0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
21ed0 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
21ee0 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
21ef0 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
21f00 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
21f10 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
21f20 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
21f30 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
21f40 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
21f50 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
21f60 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
21f70 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
21f80 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
21f90 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
21fa0 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
21fb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21fc0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
21fd0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
21fe0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
21ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
22000 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
22010 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41  ExprSkipCollateA
22020 6e 64 4c 69 6b 65 6c 79 28 70 4f 72 64 65 72 42  ndLikely(pOrderB
22030 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
22040 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
22050 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
22060 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22070 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
22080 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
22090 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
220a0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
220b0 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49  ereFindTerm(&pWI
220c0 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
220d0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
220e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
220f0 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
22100 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20   eqOpMask, 0);. 
22110 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
22120 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22130 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
22140 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
22150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  ){.        /* IN
22160 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20   terms are only 
22170 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e  valid for sortin
22180 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  g in the ORDER B
22190 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20  Y LIMIT .       
221a0 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
221b0 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20  , and then only 
221c0 69 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75  if they are actu
221d0 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20  ally used.      
221e0 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72    ** by the quer
221f0 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20  y plan */.      
22200 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
22210 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
22220 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  ERBY_LIMIT );.  
22230 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
22240 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26  <pLoop->nLTerm &
22250 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e  & pTerm!=pLoop->
22260 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b  aLTerm[j]; j++){
22270 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
22280 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29  =pLoop->nLTerm )
22290 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
222a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
222b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
222c0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
222d0 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
222e0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
222f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
22300 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70  prCollSeqMatch(p
22310 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a  WInfo->pParse, .
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
22340 2e 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70  .pExpr, pTerm->p
22350 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Expr)==0 ){.    
22360 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22380 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
22390 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
223a0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _IS );.      }. 
223b0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
223c0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
223d0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
223e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
223f0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
22400 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
22410 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22420 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
22430 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
22440 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
22450 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
22460 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
22470 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
22480 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
22490 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
224a0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
224b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
224c0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
224d0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
224e0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
224f0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
22500 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
22510 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
22520 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
22530 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
22540 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
22550 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
22560 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
22570 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
22580 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a  mn-1]==XN_ROWID.
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61            || !Ha
225b0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
225c0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
225d0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
225e0 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78   = IsUniqueIndex
225f0 28 70 49 6e 64 65 78 29 0a 20 20 20 20 20 20 20  (pIndex).       
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
22620 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
22630 49 50 53 43 41 4e 29 3d 3d 30 3b 0a 20 20 20 20  IPSCAN)==0;.    
22640 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
22650 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
22660 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
22670 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
22680 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
22690 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
226a0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
226b0 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
226c0 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
226d0 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
226e0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
226f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
22700 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20  j=0; j<nColumn; 
22710 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38  j++){.        u8
22720 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54   bOnce = 1; /* T
22730 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
22740 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
22750 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
22760 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70  assert( j>=pLoop
22770 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20  ->u.btree.nEq . 
22780 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
22790 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  Loop->aLTerm[j]=
227a0 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e  =0)==(j<pLoop->n
227b0 53 6b 69 70 29 0a 20 20 20 20 20 20 20 20 29 3b  Skip).        );
227c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
227d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
227e0 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e  q && j>=pLoop->n
227f0 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
22800 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f    u16 eOp = pLoo
22810 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
22820 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20  perator;..      
22830 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
22840 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64 20 49   == and IS and I
22850 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41  SNULL terms.  (A
22860 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d  lso skip IN term
22870 73 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 20  s when.         
22880 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52 45 5f   ** doing WHERE_
22890 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72  ORDERBY_LIMIT pr
228a0 6f 63 65 73 73 69 6e 67 29 2e 20 20 45 78 63 65  ocessing).  Exce
228b0 70 74 2c 20 49 53 20 61 6e 64 20 49 53 4e 55 4c  pt, IS and ISNUL
228c0 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  L.          ** t
228d0 65 72 6d 73 20 69 6d 70 6c 79 20 74 68 61 74 20  erms imply that 
228e0 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  the index is not
228f0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
22900 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 0a 20   in which case. 
22910 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
22920 6c 6f 6f 70 20 6e 65 65 64 20 74 6f 20 62 65 20  loop need to be 
22930 6d 61 72 6b 65 64 20 61 73 20 6e 6f 74 20 6f 72  marked as not or
22940 64 65 72 2d 64 69 73 74 69 6e 63 74 20 62 65 63  der-distinct bec
22950 61 75 73 65 20 69 74 20 63 61 6e 0a 20 20 20 20  ause it can.    
22960 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 72 65        ** have re
22970 70 65 61 74 65 64 20 4e 55 4c 4c 20 72 6f 77 73  peated NULL rows
22980 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
22990 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
229a0 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
229b0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  is a column of a
229c0 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c  n ((?,?) IN (SEL
229d0 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20  ECT...)) .      
229e0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
229f0 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  n for which the 
22a00 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d  SELECT returns m
22a10 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
22a20 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  umn,.          *
22a30 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  * check that it 
22a40 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75  is the only colu
22a50 6d 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20  mn used by this 
22a60 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  loop. Otherwise,
22a70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66  .          ** if
22a80 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77   it is one of tw
22a90 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20  o or more, none 
22aa0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63  of the columns c
22ab0 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  an be.          
22ac0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  ** considered to
22ad0 20 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20   match an ORDER 
22ae0 42 59 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 20  BY term..       
22af0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22b00 69 66 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d  if( (eOp & eqOpM
22b10 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
22b20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
22b30 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
22b40 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  S) ){.          
22b50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
22b60 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  p & WO_ISNULL );
22b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
22b80 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
22b90 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
22ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22bb0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
22bd0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
22be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22c00 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
22c10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22c20 41 4c 57 41 59 53 28 65 4f 70 20 26 20 57 4f 5f  ALWAYS(eOp & WO_
22c30 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IN) ){.         
22c40 20 20 20 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a     /* ALWAYS() j
22c50 75 73 74 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f  ustification: eO
22c60 70 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  p is an equality
22c70 20 6f 70 65 72 61 74 6f 72 20 64 75 65 20 74 6f   operator due to
22c80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
22c90 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62   ** j<pLoop->u.b
22ca0 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61  tree.nEq constra
22cb0 69 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e 79 20  int above.  Any 
22cc0 65 71 75 61 6c 69 74 79 20 6f 74 68 65 72 0a 20  equality other. 
22cd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
22ce0 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61 70 74  an WO_IN is capt
22cf0 75 72 65 64 20 62 79 20 74 68 65 20 70 72 65 76  ured by the prev
22d00 69 6f 75 73 20 22 69 66 22 2e 20 20 53 6f 20 74  ious "if".  So t
22d10 68 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20  his one.        
22d20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61      ** always ha
22d30 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a  s to be WO_IN. *
22d40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
22d50 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e  pr *pX = pLoop->
22d60 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72  aLTerm[j]->pExpr
22d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
22d80 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70  r(i=j+1; i<pLoop
22d90 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69  ->u.btree.nEq; i
22da0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22db0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c     if( pLoop->aL
22dc0 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d  Term[i]->pExpr==
22dd0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
22de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22df0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  Loop->aLTerm[i]-
22e00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22e10 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IN) );.         
22e20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 30         bOnce = 0
22e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22e70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
22e80 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
22e90 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
22ea0 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
22eb0 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
22ec0 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
22ed0 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
22ee0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
22ef0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
22f00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
22f10 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
22f20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
22f30 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
22f40 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
22f50 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
22f60 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
22f70 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
22f80 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
22f90 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
22fa0 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44  olumn = XN_ROWID
22fb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22fc0 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
22fd0 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  mn = XN_ROWID;. 
22fe0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
22ff0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
23000 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
23010 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
23020 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
23030 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
23040 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
23050 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
23060 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
23070 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23080 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
23090 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
230a0 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
230b0 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
230c0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
230d0 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
230e0 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
230f0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
23100 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
23110 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
23120 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
23130 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
23140 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
23150 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
23160 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
23170 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
23180 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
23190 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
231a0 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
231b0 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
231c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  */.        isMat
231d0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
231e0 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
231f0 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
23200 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
23210 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
23220 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
23230 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
23240 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23250 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69  SkipCollateAndLi
23260 6b 65 6c 79 28 70 4f 72 64 65 72 42 79 2d 3e 61  kely(pOrderBy->a
23270 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
23280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23290 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
232a0 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
232b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
232c0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
232d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
232e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
232f0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
23300 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
23310 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
23320 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
23330 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
23340 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57 49 44  Column>=XN_ROWID
23350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23360 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
23370 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
23380 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
23390 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
233a0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
233b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
233c0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
233d0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
233e0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
233f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23400 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
23410 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70 49 6e   *pIdxExpr = pIn
23420 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  dex->aColExpr->a
23430 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
23440 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23450 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
23460 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64 78 45  p(pOBExpr, pIdxE
23470 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a 20 20  xpr, iCur) ){.  
23480 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
23490 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
234a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
234b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
234c0 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44 20  olumn!=XN_ROWID 
234d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
234e0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
234f0 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 49 6e  prNNCollSeq(pWIn
23500 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
23510 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
23520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
23530 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23540 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
23550 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
23560 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
23570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23580 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74 72          if( wctr
23590 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
235a0 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20  ISTINCTBY ){.   
235b0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
235c0 75 2e 62 74 72 65 65 2e 6e 44 69 73 74 69 6e 63  u.btree.nDistinc
235d0 74 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20  tCol = j+1;.    
235e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
235f0 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
23600 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23620 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
23630 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
23640 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
23650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
23660 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
23670 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
23680 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
23690 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
236a0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
236b0 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
236c0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
236d0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
236e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
236f0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
23700 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
23710 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
23720 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
23730 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
23740 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23750 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
23760 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
23770 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
23780 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
23790 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
237a0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
237b0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
237c0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
237d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
237e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
237f0 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
23800 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
23810 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn==XN_ROWID ){.
23820 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
23830 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
23840 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
23850 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
23860 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
23870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23880 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
23890 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
238a0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
238b0 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
238c0 59 5f 4d 49 4e 29 20 26 26 20 6a 3d 3d 70 4c 6f  Y_MIN) && j==pLo
238d0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
238e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
238f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
23900 20 57 48 45 52 45 5f 4d 49 4e 5f 4f 52 44 45 52   WHERE_MIN_ORDER
23910 45 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ED;.          }.
23920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23930 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
23940 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
23950 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
23960 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
23970 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
23980 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
23990 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
239a0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
239b0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
239c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
239d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
239e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
239f0 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
23a00 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
23a10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
23a20 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
23a30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23a40 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
23a50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
23a60 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
23a70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
23a80 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
23a90 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
23aa0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
23ab0 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
23ac0 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
23ad0 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
23ae0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
23af0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
23b00 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
23b10 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
23b20 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
23b30 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
23b40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
23b50 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42  pr *p;.        B
23b60 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20  itmask mTerm;.  
23b70 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
23b80 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
23b90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23ba0 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
23bb0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
23bc0 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74     mTerm = sqlit
23bd0 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
23be0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
23bf0 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69  et,p);.        i
23c00 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21  f( mTerm==0 && !
23c10 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
23c20 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69  stant(p) ) conti
23c30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
23c40 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69   (mTerm&~orderDi
23c50 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29  stinctMask)==0 )
23c60 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  {.          obSa
23c70 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
23c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23c90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
23ca0 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65  End the loop ove
23cb0 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73  r all WhereLoops
23cc0 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74   from outer-most
23cd0 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d   down to inner-m
23ce0 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53  ost */.  if( obS
23cf0 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74  at==obDone ) ret
23d00 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79  urn (i8)nOrderBy
23d10 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
23d20 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
23d30 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31  for(i=nOrderBy-1
23d40 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
23d50 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d     Bitmask m = M
23d60 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20  ASKBIT(i) - 1;. 
23d70 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26       if( (obSat&
23d80 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69  m)==m ) return i
23d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
23da0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
23db0 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn -1;.}.../*.**
23dc0 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   If the WHERE_GR
23dd0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
23de0 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61  t in the mask pa
23df0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
23e00 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20  hereBegin(),.** 
23e10 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  the planner assu
23e20 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65  mes that the spe
23e30 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20  cified pOrderBy 
23e40 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79  list is actually
23e50 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63   a GROUP.** BY c
23e60 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61  lause - and so a
23e70 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72  ny order that gr
23e80 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71  oups rows as req
23e90 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20  uired satisfies 
23ea0 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a  the.** request..
23eb0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
23ec0 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
23ed0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
23ee0 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74  for the caller t
23ef0 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
23f00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
23f10 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c  e rows are reall
23f20 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65  y being delivere
23f30 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  d in sorted orde
23f40 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e  r, or.** just in
23f50 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65   some other orde
23f60 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  r that provides 
23f70 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f  the required gro
23f80 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  uping. However,.
23f90 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
23fa0 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67  SORTBYGROUP flag
23fb0 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20   is also passed 
23fc0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
23fd0 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20  egin(), then.** 
23fe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
23ff0 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74  y be called on t
24000 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72  he returned Wher
24010 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74  eInfo object. It
24020 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65   returns.** true
24030 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61   if the rows rea
24040 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74  lly will be sort
24050 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  ed in the specif
24060 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61  ied order, or fa
24070 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  lse.** otherwise
24080 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
24090 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a  ple, assuming:.*
240a0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
240b0 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20  DEX i1 ON t1(x, 
240c0 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a  Y);.**.** then.*
240d0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
240e0 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
240f0 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c   x,y ORDER BY x,
24100 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  y;   -- IsSorted
24110 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43  ()==1.**   SELEC
24120 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
24130 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42  P BY y,x ORDER B
24140 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f  Y y,x;   -- IsSo
24150 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74  rted()==0.*/.int
24160 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
24170 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20  orted(WhereInfo 
24180 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65  *pWInfo){.  asse
24190 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
241a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
241b0 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65  ROUPBY );.  asse
241c0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
241d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
241e0 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20  ORTBYGROUP );.  
241f0 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73  return pWInfo->s
24200 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66  orted;.}..#ifdef
24210 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24220 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
24230 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
24240 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
24250 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
24260 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
24270 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
24280 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
24290 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
242a0 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
242b0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
242c0 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
242d0 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
242e0 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
242f0 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
24300 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
24310 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
24320 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
24330 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
24340 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
24350 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
24360 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61  ing nRow rows, a
24370 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
24380 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e   keys have .** n
24390 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20  Orderby columns 
243a0 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72  and that the fir
243b0 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d  st nSorted colum
243c0 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ns are already i
243d0 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  n.** order..*/.s
243e0 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
243f0 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
24400 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
24410 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f  fo,.  LogEst nRo
24420 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  w,.  int nOrderB
24430 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64  y,.  int nSorted
24440 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  .){.  /* TUNING:
24450 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
24460 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e  of a full extern
24470 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e  al sort, where N
24480 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75   is .  ** the nu
24490 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
244a0 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  sort is:.  **.  
244b0 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
244c0 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a   * N * log(N))..
244d0 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69    ** .  ** Or, i
244e0 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63  f the order-by c
244f0 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d  lause has X term
24500 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c  s but only the l
24510 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d  ast Y .  ** term
24520 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64  s are out of ord
24530 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73  er, then block-s
24540 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75  orting will redu
24550 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72  ce the .  ** sor
24560 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20  ting cost to:.  
24570 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
24580 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
24590 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a  N)) * (Y/X).  **
245a0 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20  .  ** The (Y/X) 
245b0 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e  term is implemen
245c0 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20  ted using stack 
245d0 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a  variable rScale.
245e0 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a    ** below.  */.
245f0 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c    LogEst rScale,
24600 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73   rSortCost;.  as
24610 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30  sert( nOrderBy>0
24620 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c   && 66==sqlite3L
24630 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
24640 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33  rScale = sqlite3
24650 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79  LogEst((nOrderBy
24660 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f  -nSorted)*100/nO
24670 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20  rderBy) - 66;.  
24680 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
24690 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a   + rScale + 16;.
246a0 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62  .  /* Multiple b
246b0 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20 4d  y log(M) where M
246c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
246d0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 20  f output rows.. 
246e0 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d 49   ** Use the LIMI
246f0 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69 73  T for M if it is
24700 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66   smaller */.  if
24710 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
24720 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53  Flags & WHERE_US
24730 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20 70  E_LIMIT)!=0 && p
24740 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52  WInfo->iLimit<nR
24750 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d  ow ){.    nRow =
24760 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b   pWInfo->iLimit;
24770 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74  .  }.  rSortCost
24780 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29   += estLog(nRow)
24790 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74  ;.  return rSort
247a0 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Cost;.}../*.** G
247b0 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
247c0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
247d0 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
247e0 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
247f0 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
24800 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
24810 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
24820 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
24830 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
24840 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
24850 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
24860 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
24870 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
24880 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
24890 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
248a0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
248b0 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
248c0 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
248d0 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
248e0 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
248f0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
24900 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
24910 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
24920 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
24930 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
24940 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
24950 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
24960 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
24970 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
24980 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
24990 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
249a0 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
249b0 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52  WInfo, LogEst nR
249c0 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
249d0 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
249e0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
249f0 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
24a00 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
24a10 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
24a20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
24a30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24a40 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
24a50 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
24a60 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
24a70 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24a80 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
24a90 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
24aa0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
24ab0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
24ac0 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ae0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
24af0 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
24b00 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
24b10 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
24b20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
24b30 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
24b40 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
24b50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24b60 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
24b70 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e   replace */.  in
24b80 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
24b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24ba0 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c  r of ORDER BY cl
24bb0 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ause terms */.  
24bc0 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20  LogEst mxCost = 
24bd0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
24be0 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
24bf0 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
24c00 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74   LogEst mxUnsort
24c10 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  ed = 0;    /* Ma
24c20 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63  ximum unsorted c
24c30 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
24c40 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  path */.  int nT
24c50 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
24c60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24c70 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
24c80 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
24c90 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
24ca0 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
24cb0 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
24cc0 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
24cd0 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
24ce0 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
24cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24d00 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
24d10 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
24d20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
24d30 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
24d40 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
24d50 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
24d60 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
24d70 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
24d80 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
24d90 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
24da0 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
24db0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
24dc0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
24dd0 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
24de0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
24df0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
24e00 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
24e10 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
24e20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
24e30 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
24e40 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  mory */.  LogEst
24e50 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b   *aSortCost = 0;
24e60 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61      /* Sorting a
24e70 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69  nd partial sorti
24e80 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68  ng costs */.  ch
24e90 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
24ea0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
24eb0 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
24ec0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
24ed0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
24ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ef0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
24f00 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70  e allocated at p
24f10 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72  Space */..  pPar
24f20 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
24f30 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
24f40 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
24f50 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
24f60 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
24f70 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
24f80 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
24f90 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
24fa0 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
24fb0 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
24fc0 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
24fd0 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
24fe0 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
24ff0 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
25000 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
25010 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
25020 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20   = (nLoop<=1) ? 
25030 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
25040 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
25050 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
25060 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
25070 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
25080 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
25090 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e  egin solver.  (n
250a0 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e  RowEst=%d)\n", n
250b0 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20  RowEst));..  /* 
250c0 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65  If nRowEst is ze
250d0 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ro and there is 
250e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
250f0 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49  se, ignore it. I
25100 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65  n this.  ** case
25110 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
25120 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
25130 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
25140 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75  ber of rows retu
25150 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rned.  ** by the
25160 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20   overall query. 
25170 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61  Once this estima
25180 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  te has been obta
25190 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  ined, the caller
251a0 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b  .  ** will invok
251b0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
251c0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70  a second time, p
251d0 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d  assing the estim
251e0 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ate as the.  ** 
251f0 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65  nRowEst paramete
25200 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  r.  */.  if( pWI
25210 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
25220 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
25230 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
25240 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
25250 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e   nOrderBy = pWIn
25260 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
25270 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  xpr;.  }..  /* A
25280 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
25290 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
252a0 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20   aTo, aFrom and 
252b0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20  aSortCost[] */. 
252c0 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f   nSpace = (sizeo
252d0 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
252e0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
252f0 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
25300 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73  2;.  nSpace += s
25310 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
25320 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61  nOrderBy;.  pSpa
25330 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
25340 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53  llocRawNN(db, nS
25350 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70  pace);.  if( pSp
25360 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
25370 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
25380 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  T;.  aTo = (Wher
25390 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
253a0 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
253b0 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
253c0 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
253d0 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
253e0 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
253f0 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
25400 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
25410 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
25420 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
25430 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
25440 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
25450 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
25460 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20  .  if( nOrderBy 
25470 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
25480 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
25490 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20  Y clause and it 
254a0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e  is not being ign
254b0 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20  ored, set up.   
254c0 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68   ** space for th
254d0 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72  e aSortCost[] ar
254e0 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e  ray. Each elemen
254f0 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f  t of the aSortCo
25500 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  st array.    ** 
25510 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d  is either zero -
25520 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20   meaning it has 
25530 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69  not yet been ini
25540 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68  tialized - or th
25550 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66  e.    ** cost of
25560 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74   sorting nRowEst
25570 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68   rows of data wh
25580 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58 20  ere the first X 
25590 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20  terms of.    ** 
255a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
255b0 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  use are already 
255c0 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20  in order, where 
255d0 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20 0a  X is the array .
255e0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a      ** index.  *
255f0 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20  /.    aSortCost 
25600 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20  = (LogEst*)pX;. 
25610 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43     memset(aSortC
25620 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c  ost, 0, sizeof(L
25630 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
25640 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  y);.  }.  assert
25650 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c  ( aSortCost==0 |
25660 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
25670 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74  ]==(char*)&aSort
25680 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29  Cost[nOrderBy] )
25690 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72  ;.  assert( aSor
256a0 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70  tCost!=0 || &pSp
256b0 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68  ace[nSpace]==(ch
256c0 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20  ar*)pX );..  /* 
256d0 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
256e0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
256f0 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
25700 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
25710 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
25720 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
25730 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
25740 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
25750 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20 63  ve 28.  If the c
25760 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
25770 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
25780 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
25790 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
257a0 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20 20   the first 28.  
257b0 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
257c0 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
257d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
257e0 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
257f0 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
25800 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20  QueryLoop, 48); 
25810 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c   assert( 48==sql
25820 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29  ite3LogEst(28) )
25830 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20  ;.  nFrom = 1;. 
25840 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30   assert( aFrom[0
25850 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29  ].isOrdered==0 )
25860 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
25870 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c   ){.    /* If nL
25880 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  oop is zero, the
25890 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46  n there are no F
258a0 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ROM terms in the
258b0 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20   query. Since.  
258c0 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
258d0 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79 20  e the query may 
258e0 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d  return a maximum
258f0 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65   of one row, the
25900 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20   results.    ** 
25910 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
25920 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72 64  he requested ord
25930 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65  er. Set isOrdere
25940 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f  d to nOrderBy to
25950 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65  .    ** indicate
25960 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c   this. Or, if nL
25970 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  oop is greater t
25980 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73  han zero, set is
25990 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a  Ordered to.    *
259a0 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  * -1, indicating
259b0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
259c0 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20   set may or may 
259d0 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20  not be ordered, 
259e0 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e  .    ** dependin
259f0 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61  g on the loops a
25a00 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  dded to the curr
25a10 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20  ent plan.  */.  
25a20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64    aFrom[0].isOrd
25a30 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f  ered = nLoop>0 ?
25a40 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a   -1 : nOrderBy;.
25a50 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
25a60 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c  e successively l
25a70 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73  onger WherePaths
25a80 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69   using the previ
25a90 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20  ous generation. 
25aa0 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68   ** of WherePath
25ab0 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66  s as the basis f
25ac0 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65  or the next.  Ke
25ad0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
25ae0 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65  mxChoice.  ** be
25af0 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68  st paths at each
25b00 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
25b10 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
25b20 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
25b30 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30  ++){.    nTo = 0
25b40 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20  ;.    for(ii=0, 
25b50 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c  pFrom=aFrom; ii<
25b60 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72  nFrom; ii++, pFr
25b70 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  om++){.      for
25b80 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e  (pWLoop=pWInfo->
25b90 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20  pLoops; pWLoop; 
25ba0 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70  pWLoop=pWLoop->p
25bb0 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20  NextLoop){.     
25bc0 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20     LogEst nOut; 
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73       /* Rows vis
25bf0 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70  ited by (pFrom+p
25c00 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
25c10 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20    LogEst rCost; 
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c30 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70      /* Cost of p
25c40 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  ath (pFrom+pWLoo
25c50 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
25c60 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20  gEst rUnsorted; 
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74  /* Unsorted cost
25c90 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   of (pFrom+pWLoo
25ca0 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38  p) */.        i8
25cb0 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
25cc0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20  om->isOrdered;  
25cd0 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72  /* isOrdered for
25ce0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
25cf0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
25d00 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20  sk maskNew;     
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69  Mask of src visi
25d30 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20  ted by (..) */. 
25d40 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
25d50 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  evMask = 0;     
25d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
25d70 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f   of rev-order lo
25d80 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a  ops for (..) */.
25d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25da0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
25db0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
25dc0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
25dd0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
25de0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
25df0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
25e00 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
25e10 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
25e20 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
25e30 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
25e40 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52  !=0 && pFrom->nR
25e50 6f 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20  ow<3 ){.        
25e60 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20    /* Do not use 
25e70 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
25e80 65 78 20 69 66 20 74 68 65 20 74 68 69 73 20 6c  ex if the this l
25e90 6f 6f 70 20 69 73 20 65 78 70 65 63 74 65 64 0a  oop is expected.
25ea0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
25eb0 72 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31 2e  run less than 1.
25ec0 32 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69 73  25 times.  It is
25ed0 20 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 73   tempting to als
25ee0 6f 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20 20  o exclude.      
25ef0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
25f00 20 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e 20   index usage on 
25f10 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 62  an outer loop, b
25f20 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e 20  ut sometimes an 
25f30 61 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20 20  automatic.      
25f40 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20      ** index is 
25f50 75 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f 75  useful in the ou
25f60 74 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63 6f  ter loop of a co
25f70 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
25f80 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
25f90 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
25fa0 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
25fb0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
25fc0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ue;.        }.. 
25fd0 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
25fe0 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
25ff0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
26000 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
26010 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
26020 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
26030 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73   */.        rUns
26040 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
26050 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
26060 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
26070 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
26080 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e  ow);.        rUn
26090 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
260a0 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
260b0 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73  ted, pFrom->rUns
260c0 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  orted);.        
260d0 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  nOut = pFrom->nR
260e0 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75  ow + pWLoop->nOu
260f0 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  t;.        maskN
26100 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
26110 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
26120 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
26130 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30   if( isOrdered<0
26140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
26150 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50  Ordered = whereP
26160 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
26170 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
261a0 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
261b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
261e0 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b  Loop, &revMask);
261f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26200 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
26210 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
26220 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
26230 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
26240 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65  red>=0 && isOrde
26250 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a  red<nOrderBy ){.
26260 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53            if( aS
26270 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
26280 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d]==0 ){.       
26290 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
262a0 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72  sOrdered] = wher
262b0 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
262d0 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e  Info, nRowEst, n
262e0 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72  OrderBy, isOrder
262f0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ed.            )
26300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26310 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
26320 47 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c 20  G:  Add a small 
26330 65 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28 35  extra penalty (5
26340 29 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73 20  ) to sorting as 
26350 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
26360 65 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d 65  extra encouragme
26370 6e 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20  nt to the query 
26380 70 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65 63  planner to selec
26390 74 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20 20  t a plan.       
263a0 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
263b0 72 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20 74  rows emerge in t
263c0 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
263d0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f 72   without any sor
263e0 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ting.          *
263f0 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  * required. */. 
26400 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
26410 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
26420 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f  d(rUnsorted, aSo
26430 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
26440 5d 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20 20  ]) + 5;..       
26450 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
26460 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  002,.           
26470 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
26480 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
26490 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
264a0 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
264c0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
264d0 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69  ed], (nOrderBy-i
264e0 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65  sOrdered), nOrde
264f0 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
26500 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20       rUnsorted, 
26510 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20  rCost));.       
26520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26530 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72    rCost = rUnsor
26540 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ted;.          r
26550 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20  Unsorted -= 2;  
26560 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67  /* TUNING:  Slig
26570 68 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f 72  ht bias in favor
26580 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e   of no-sort plan
26590 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a  s */.        }..
265a0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
265b0 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
265c0 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
265d0 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a  d to the set of.
265e0 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f          ** mxCho
265f0 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ice best-so-far 
26600 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a  paths..        *
26610 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72  *.        ** Fir
26620 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  st look for an e
26630 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f  xisting path amo
26640 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
26650 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  aths.        ** 
26660 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20  that covers the 
26670 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
26680 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
26690 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  me isOrdered.   
266a0 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20       ** setting 
266b0 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  as the current p
266c0 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20  ath candidate.. 
266d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
266e0 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28    ** The term "(
266f0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
26700 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
26710 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65  ==0" is equivale
26720 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  nt.        ** to
26730 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
26740 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65  ==(-1))==(isOrde
26750 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20  red==(-1))" for 
26760 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20  the range.      
26770 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61    ** of legal va
26780 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72  lues for isOrder
26790 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20  ed, -1..64..    
267a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
267b0 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
267c0 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
267d0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
267e0 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
267f0 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20  oop==maskNew.   
26800 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
26810 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
26820 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a  dered)&0x80)==0.
26830 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26840 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
26850 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
26860 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
26870 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
26880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26890 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
268a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
268b0 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  e of the existin
268c0 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
268d0 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61  ths match the ca
268e0 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ndidate. */.    
268f0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
26900 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
26910 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43     && (rCost>mxC
26920 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d  ost || (rCost==m
26930 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74  xCost && rUnsort
26940 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29  ed>=mxUnsorted))
26950 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
26960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26970 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61   current candida
26980 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20  te is no better 
26990 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  than any of the 
269a0 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
269b0 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75       ** paths cu
269c0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62  rrently in the b
269d0 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65  est-so-far buffe
269e0 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20  r.  So discard. 
269f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
26a00 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20  is candidate as 
26a10 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23  not viable. */.#
26a20 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
26a30 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
26a40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
26a50 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26a60 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
26a70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26a80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
26a90 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
26aa0 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
26ab0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
26ac0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
26ad0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
26ae0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
26af0 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f  ost, nOut, rUnso
26b00 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
26b10 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
26b20 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
26b30 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
26b40 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
26b50 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
26b60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26b70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
26b80 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
26b90 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e  s points it mean
26ba0 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63  s that the new c
26bb0 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20  andidate path.  
26bc0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73          ** needs
26bd0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
26be0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d  the set of best-
26bf0 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f  so-far paths. */
26c00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
26c10 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  To<mxChoice ){. 
26c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26c30 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
26c40 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62  of the aTo set b
26c50 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20  y one */.       
26c60 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b       jj = nTo++;
26c70 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
26c90 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63   New path replac
26ca0 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72  es the prior wor
26cb0 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74  st to keep count
26cc0 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20   below mxChoice 
26cd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
26ce0 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20  j = mxI;.       
26cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
26d00 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23  To = &aTo[jj];.#
26d10 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
26d20 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
26d30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
26d40 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26d50 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
26d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26d70 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20  ugPrintf("New   
26d80 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
26d90 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
26da0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26db0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
26dc0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
26dd0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
26de0 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a  Out, rUnsorted,.
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
26e10 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
26e20 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
26e30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
26e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26e50 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
26e60 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74  hes here if best
26e70 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f  -so-far path pTo
26e80 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20  =aTo[jj] covers 
26e90 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
26ea0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
26eb0 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
26ec0 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73 65  ame isOrdered se
26ed0 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20  tting as the.   
26ee0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64         ** candid
26ef0 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b  ate path.  Check
26f00 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
26f10 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20  andidate should 
26f20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20  replace.        
26f30 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74    ** pTo or if t
26f40 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
26f50 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  uld be skipped..
26f60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20            ** .  
26f70 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63          ** The c
26f80 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e  onditional is an
26f90 20 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f 72   expanded vector
26fa0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75 69   comparison equi
26fb0 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20  valent to:.     
26fc0 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e       **   (pTo->
26fd0 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c  rCost,pTo->nRow,
26fe0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20  pTo->rUnsorted) 
26ff0 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72  <= (rCost,nOut,r
27000 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20  Unsorted).      
27010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
27020 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c   if( pTo->rCost<
27030 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  rCost .         
27040 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
27050 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20 20  ==rCost.        
27060 20 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d 3e         && (pTo->
27070 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20  nRow<nOut.      
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
27090 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74  (pTo->nRow==nOut
270a0 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74   && pTo->rUnsort
270b0 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20  ed<=rUnsorted). 
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ).             
270e0 20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a   ).          ){.
270f0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
27100 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
27110 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27120 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
27130 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
27140 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27150 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27170 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74   "Skip   %s cost
27180 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
27190 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
271a0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
271b0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
271c0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
271d0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e  rCost, nOut, rUn
271e0 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  sorted,.        
271f0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
27200 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
27210 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
27230 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27240 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
27250 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
27260 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
27270 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
27280 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
27290 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
272a0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
272b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
272c0 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
272d0 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  ed, pTo->isOrder
272e0 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
272f0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
27300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
27310 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27320 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
27330 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
27340 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63  h from further c
27350 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
27360 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
27370 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
27380 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
27390 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
273a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
273b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
273c0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
273d0 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
273e0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
273f0 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65  ches here if the
27400 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
27410 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  is better than t
27420 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
27430 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61  pTo path.  Repla
27440 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20  ce pTo with the 
27450 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69  candidate. */.#i
27460 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
27470 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
27480 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
27490 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
274a0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
274b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
274c0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
274d0 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
274e0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
274f0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
27500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27510 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
27520 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
27530 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
27540 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20  t, rUnsorted,.  
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
27560 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
27570 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
27580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
27590 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
275a0 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
275b0 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
275c0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
275d0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
275e0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
275f0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
27600 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
27610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27620 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64    pTo->rUnsorted
27630 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  , pTo->isOrdered
27640 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
27650 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
27660 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
27670 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
27680 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
27690 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
276a0 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
276b0 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
276c0 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
276d0 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
276e0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
276f0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
27700 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
27710 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
27720 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
27730 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
27740 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
27750 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
27760 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e  >rUnsorted = rUn
27770 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
27780 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
27790 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
277a0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
277b0 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
277c0 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
277d0 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
277e0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
277f0 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
27800 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
27810 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
27820 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
27830 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
27840 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
27850 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
27860 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b  xUnsorted = aTo[
27870 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  0].nRow;.       
27880 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
27890 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
278a0 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
278b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
278c0 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
278d0 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  mxCost .        
278e0 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
278f0 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
27900 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78  To->rUnsorted>mx
27910 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20  Unsorted) .     
27920 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27930 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
27940 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
27950 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73             mxUns
27960 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e  orted = pTo->rUn
27970 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
27980 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
27990 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
279a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
279b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
279c0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
279d0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
279e0 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
279f0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
27a00 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20  e & 0x02 ){.    
27a10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27a20 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
27a30 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
27a40 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
27a50 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
27a60 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
27a70 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
27a80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27a90 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
27aa0 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
27ab0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
27ac0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
27ad0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
27ae0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
27af0 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
27b00 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
27b10 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
27b20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
27b30 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
27b40 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
27b50 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
27b60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27b70 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
27b80 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
27b90 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
27ba0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
27bb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27bc0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
27bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
27be0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
27bf0 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
27c00 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
27c10 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
27c20 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
27c30 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
27c40 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
27c50 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
27c60 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
27c70 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
27c80 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
27c90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27ca0 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
27cb0 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
27cc0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
27cd0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
27ce0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27cf0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
27d00 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
27d10 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
27d20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
27d30 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
27d40 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
27d50 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
27d60 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
27d70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
27d80 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
27d90 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
27da0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
27db0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
27dc0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
27dd0 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
27de0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
27df0 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
27e00 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
27e10 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
27e20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
27e30 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
27e40 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
27e50 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
27e60 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
27e70 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
27e80 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
27e90 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
27ea0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
27eb0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
27ec0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
27ed0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
27ee0 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
27ef0 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
27f00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27f10 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
27f20 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
27f30 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27f40 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
27f50 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
27f60 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
27f70 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
27f80 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
27f90 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
27fa0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
27fb0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
27fc0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
27fd0 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
27fe0 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
27ff0 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
28000 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
28010 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
28020 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
28030 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
28040 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
28050 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
28060 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
28070 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
28080 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
28090 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
280a0 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f    }.  }.  pWInfo
280b0 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
280c0 6f 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oop = 0;.  if( p
280d0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
280e0 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
280f0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
28100 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
28110 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
28120 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
28130 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
28140 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
28150 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
28160 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
28170 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
28180 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28190 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
281a0 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
281b0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
281c0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
281d0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
281e0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  p;.      if( pWI
281f0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29  nfo->nOBSat<=0 )
28200 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
28210 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
28220 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e        if( nLoop>
28230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
28240 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72  32 wsFlags = pFr
28250 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
28260 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  1]->wsFlags;.   
28270 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c         if( (wsFl
28280 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
28290 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  OW)==0 .        
282a0 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26 28     && (wsFlags&(
282b0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
282c0 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48  COLUMN_IN))!=(WH
282d0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f  ERE_IPK|WHERE_CO
282e0 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20  LUMN_IN).       
282f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28300 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
28310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
28320 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
28330 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
28340 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
28350 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
28360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28370 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44         WHERE_ORD
28380 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f  ERBY_LIMIT, nLoo
28390 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
283a0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b  p[nLoop-1], &m);
283b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
283c0 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
283d0 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20   WHERE_IPK );.  
283e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
283f0 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
28400 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
28410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28420 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72   rc==pWInfo->pOr
28430 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
28450 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Info->bOrderedIn
28460 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20  nerLoop = 1;.   
28470 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
28480 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a  o->revMask = m;.
28490 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
284a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
284b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
284c0 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
284d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
284e0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
284f0 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
28500 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
28510 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
28520 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
28530 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
28540 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
28550 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
28560 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
28570 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
28580 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
28590 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
285a0 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
285b0 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
285c0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
285d0 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
285e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
285f0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
28600 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
28610 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
28620 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
28630 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
28640 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
28650 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
28660 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
28670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28680 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
28690 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
286a0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
286b0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
286c0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
286d0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
286e0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70  DbFreeNN(db, pSp
286f0 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ace);.  return S
28700 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28710 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20  ** Most queries 
28720 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  use only a singl
28730 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72  e table (they ar
28740 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64  e not joins) and
28750 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20   have.** simple 
28760 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  == constraints a
28770 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66  gainst indexed f
28780 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75  ields.  This rou
28790 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a  tine attempts.**
287a0 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73   to plan those s
287b0 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e  imple cases usin
287c0 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65  g much less cere
287d0 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a  mony than the.**
287e0 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
287f0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20   query planner, 
28800 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c  and thereby yiel
28810 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33  d faster sqlite3
28820 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69  _prepare().** ti
28830 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  mes for the comm
28840 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  on case..**.** R
28850 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
28860 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68  n success, if th
28870 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20  is query can be 
28880 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a  handled by this.
28890 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65  ** no-frills que
288a0 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74  ry planner.  Ret
288b0 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73  urn zero if this
288c0 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65   query needs the
288d0 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72   .** general-pur
288e0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
288f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28900 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  t whereShortCut(
28910 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
28920 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
28930 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
28940 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
28950 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
28960 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
28970 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  WC;.  WhereTerm 
28980 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c  *pTerm;.  WhereL
28990 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e  oop *pLoop;.  in
289a0 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b  t iCur;.  int j;
289b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
289c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a    Index *pIdx;..
289d0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
289e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
289f0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
28a00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
28a10 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65 74  _SUBCLAUSE ) ret
28a20 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
28a30 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
28a40 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20  t->nSrc>=1 );.  
28a50 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
28a60 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
28a70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
28a80 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  b;.  if( IsVirtu
28a90 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
28aa0 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  n 0;.  if( pItem
28ab0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
28ac0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
28ad0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
28ae0 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70  rsor;.  pWC = &p
28af0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c  WInfo->sWC;.  pL
28b00 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  oop = pBuilder->
28b10 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  pNew;.  pLoop->w
28b20 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c  sFlags = 0;.  pL
28b30 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  oop->nSkip = 0;.
28b40 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
28b50 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
28b60 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
28b70 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29   WO_EQ|WO_IS, 0)
28b80 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
28b90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
28ba0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28bb0 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70  & WO_IS );.    p
28bc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
28bd0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
28be0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
28bf0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f  ONEROW;.    pLoo
28c00 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  p->aLTerm[0] = p
28c10 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Term;.    pLoop-
28c20 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
28c30 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
28c40 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20  nEq = 1;.    /* 
28c50 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
28c60 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69  a rowid lookup i
28c70 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f  s 10 */.    pLoo
28c80 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f  p->rRun = 33;  /
28c90 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 33==sqlite3Log
28ca0 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  Est(10) */.  }el
28cb0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
28cc0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
28cd0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
28ce0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
28cf0 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20  t opMask;.      
28d00 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
28d10 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
28d20 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
28d30 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
28d40 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20  Index(pIdx).    
28d50 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72     || pIdx->pPar
28d60 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20  tIdxWhere!=0 .  
28d70 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b       || pIdx->nK
28d80 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28  eyCol>ArraySize(
28d90 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
28da0 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e  ce) .      ) con
28db0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d  tinue;.      opM
28dc0 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71  ask = pIdx->uniq
28dd0 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51  NotNull ? (WO_EQ
28de0 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b  |WO_IS) : WO_EQ;
28df0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
28e00 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
28e10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
28e20 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
28e30 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
28e40 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d   iCur, j, 0, opM
28e50 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ask, pIdx);.    
28e60 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
28e70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28e80 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
28e90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28ea0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
28eb0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
28ec0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
28ed0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
28ee0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  Idx->nKeyCol ) c
28ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
28f00 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
28f10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
28f20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
28f30 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
28f40 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f    if( pIdx->isCo
28f50 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d  vering || (pItem
28f60 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64 78  ->colUsed & pIdx
28f70 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d  ->colNotIdxed)==
28f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
28f90 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
28fa0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
28fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
28fc0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
28fd0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
28fe0 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
28ff0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
29000 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
29010 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
29020 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
29030 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
29040 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
29050 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
29060 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
29070 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
29080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29090 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
290a0 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
290b0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
290c0 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
290d0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
290e0 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
290f0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
29100 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26  sMaskSet.n==1 &&
29110 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73   iCur==pWInfo->s
29120 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b  MaskSet.ix[0] );
29130 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
29140 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c  Self = 1; /* sql
29150 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
29160 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
29170 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20  et, iCur); */.  
29180 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
29190 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
291a0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
291b0 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
291c0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
291d0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
291e0 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
291f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
29200 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
29210 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29220 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
29230 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
29240 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
29250 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
29260 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
29270 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
29280 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
29290 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
292a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
292b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
292c0 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
292d0 20 66 6f 72 20 65 78 70 72 49 73 44 65 74 65 72   for exprIsDeter
292e0 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73  ministic()..*/.s
292f0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
29300 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  deIsDeterministi
29310 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  c(Walker *pWalke
29320 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
29330 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
29340 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
29350 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
29360 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74  (pExpr, EP_Const
29370 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Func)==0 ){.    
29380 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
29390 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
293a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
293b0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
293c0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nue;.}../*.** Re
293d0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
293e0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
293f0 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65  ains no non-dete
29400 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a  rministic SQL .*
29410 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20  * functions. Do 
29420 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e  not consider non
29430 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53  -deterministic S
29440 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  QL functions tha
29450 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f  t are .** part o
29460 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74 61  f sub-select sta
29470 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
29480 69 63 20 69 6e 74 20 65 78 70 72 49 73 44 65 74  ic int exprIsDet
29490 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72 20  erministic(Expr 
294a0 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
294b0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
294c0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
294d0 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
294e0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
294f0 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d  exprNodeIsDeterm
29500 69 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53 65  inistic;.  w.xSe
29510 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
29520 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
29530 46 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57  Fail;.  sqlite3W
29540 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
29550 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
29560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
29570 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
29580 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
29590 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
295a0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
295b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
295c0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
295d0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
295e0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
295f0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
29600 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
29610 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
29620 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
29630 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
29640 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
29650 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
29660 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
29670 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
29680 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
29690 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
296a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
296b0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
296c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
296d0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
296e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
296f0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
29700 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
29710 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
29720 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
29730 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
29740 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
29750 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
29760 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
29770 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
29780 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
29790 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
297a0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
297b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
297c0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
297d0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
297e0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
297f0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
29800 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
29810 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
29820 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
29830 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
29840 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
29850 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
29860 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
29870 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
29880 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
29890 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
298a0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
298b0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
298c0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
298d0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
298e0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
298f0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
29900 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
29910 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
29940 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
29950 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
29960 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
29970 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
29980 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
29990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299a0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
299b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
299c0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
299d0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
299e0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
299f0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
29a00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29a10 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
29a20 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
29a30 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
29a40 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
29a50 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
29a60 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
29a70 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
29a80 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
29a90 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
29aa0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
29ab0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
29ac0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
29ad0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
29ae0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
29af0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
29b00 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
29b10 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
29b20 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
29b30 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
29b40 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
29b50 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
29b60 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
29b70 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
29b80 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
29b90 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
29ba0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
29bb0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
29bc0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
29bd0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
29be0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
29bf0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
29c00 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
29c10 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
29c20 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
29c30 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
29c40 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
29c50 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
29c60 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
29c70 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
29c80 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
29c90 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
29ca0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
29cb0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
29cc0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
29cd0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
29ce0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
29cf0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
29d00 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
29d10 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
29d20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
29d30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
29d40 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
29d50 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
29d60 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
29d70 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
29d80 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
29d90 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
29da0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
29db0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
29dc0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
29dd0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
29de0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
29df0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
29e00 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
29e10 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
29e20 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
29e30 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
29e40 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
29e50 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
29e60 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
29e70 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
29e80 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
29e90 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
29ea0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
29eb0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
29ec0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
29ed0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
29ee0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
29ef0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
29f00 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
29f10 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
29f20 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
29f30 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
29f40 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
29f50 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
29f60 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
29f70 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
29f80 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
29f90 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
29fa0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
29fb0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
29fc0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
29fd0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
29fe0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
29ff0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
2a000 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
2a010 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
2a020 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
2a030 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
2a040 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
2a050 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
2a060 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
2a070 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
2a080 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
2a090 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
2a0a0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
2a0b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
2a0c0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
2a0d0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
2a0e0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
2a0f0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
2a100 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
2a110 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
2a120 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
2a130 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
2a140 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
2a150 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
2a160 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
2a170 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
2a180 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
2a190 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
2a1a0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
2a1b0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
2a1c0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
2a1d0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
2a1e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2a1f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2a200 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
2a210 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
2a220 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
2a230 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
2a240 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
2a250 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
2a260 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
2a270 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
2a280 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
2a290 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
2a2a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a2b0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
2a2c0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2a2d0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
2a2e0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
2a2f0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
2a300 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
2a310 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
2a320 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
2a330 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
2a340 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73  _OR_SUBCLAUSE is
2a350 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73   set, iIdxCur is
2a360 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2a370 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  er of an index.*
2a380 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20  * to use for OR 
2a390 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2a3a0 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c  g.  The WHERE cl
2a3b0 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20  ause should use 
2a3c0 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63  this.** specific
2a3d0 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45   cursor.  If WHE
2a3e0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2a3f0 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ED is set, then 
2a400 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68  iIdxCur is.** th
2a410 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69  e first cursor i
2a420 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75  n an array of cu
2a430 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
2a440 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20  dices.  iIdxCur 
2a450 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65  should.** be use
2a460 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
2a470 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72   appropriate cur
2a480 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  sor depending on
2a490 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a   which index is.
2a4a0 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72  ** used..*/.Wher
2a4b0 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
2a4c0 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
2a4d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2a4e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2a4f0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2a500 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2a510 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
2a520 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
2a530 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
2a540 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
2a550 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
2a560 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2a570 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2a580 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2a590 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52  By,     /* An OR
2a5a0 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
2a5b0 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20   BY) clause, or 
2a5c0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
2a5d0 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20  st *pResultSet, 
2a5e0 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75 6c    /* Query resul
2a5f0 74 20 73 65 74 2e 20 20 52 65 71 27 64 20 66 6f  t set.  Req'd fo
2a600 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  r DISTINCT */.  
2a610 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2a620 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2a630 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
2a640 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
2a650 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75  t.h */.  int iAu
2a660 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  xArg            
2a670 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52 5f   /* If WHERE_OR_
2a680 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74  SUBCLAUSE is set
2a690 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
2a6a0 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f  ** If WHERE_USE_
2a6d0 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20  LIMIT, then the 
2a6e0 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a  limit amount */.
2a6f0 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
2a700 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
2a710 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
2a720 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
2a730 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
2a740 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
2a750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a760 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
2a770 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
2a780 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2a790 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
2a7a0 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
2a7b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
2a7c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2a7d0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
2a7e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
2a7f0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
2a800 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
2a810 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
2a820 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
2a830 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
2a840 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
2a850 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
2a860 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
2a870 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
2a880 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
2a890 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
2a8a0 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
2a8b0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2a8c0 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
2a8d0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2a8e0 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
2a8f0 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
2a900 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
2a910 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2a920 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
2a930 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
2a940 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2a950 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  ct */.  int ii; 
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2a980 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
2a990 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
2a9a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
2a9b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
2a9c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a9e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38  urn code */.  u8
2a9f0 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b   bFordelete = 0;
2aa00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c           /* OPFL
2aa10 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20  AG_FORDELETE or 
2aa20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72  zero, as appropr
2aa30 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  iate */..  asser
2aa40 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
2aa50 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2aa60 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28  ULTIROW)==0 || (
2aa70 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c 46  .        (wctrlF
2aa80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2aa90 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
2aaa0 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72 6c   .     && (wctrl
2aab0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2aac0 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a  _SUBCLAUSE)==0 .
2aad0 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79    ));..  /* Only
2aae0 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f 52   one of WHERE_OR
2aaf0 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57 48  _SUBCLAUSE or WH
2ab00 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f  ERE_USE_LIMIT */
2ab10 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2ab20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2ab30 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a  R_SUBCLAUSE)==0.
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2ab50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ab60 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30  RE_USE_LIMIT)==0
2ab70 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62   );..  /* Variab
2ab80 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
2ab90 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
2aba0 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
2abb0 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
2abc0 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
2abd0 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
2abe0 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
2abf0 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
2ac00 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
2ac10 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
2ac20 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
2ac30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
2ac40 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
2ac50 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
2ac60 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
2ac70 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
2ac80 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
2ac90 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
2aca0 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
2acb0 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
2acc0 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
2acd0 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
2ace0 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
2acf0 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
2ad00 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2ad10 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
2ad20 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
2ad30 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2ad40 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
2ad50 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
2ad60 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
2ad70 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
2ad80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
2ad90 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
2ada0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2adb0 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2adc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
2add0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
2ade0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
2adf0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
2ae00 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
2ae10 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
2ae20 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
2ae30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2ae40 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
2ae50 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
2ae60 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
2ae70 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2ae80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ae90 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
2aea0 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
2aeb0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2aec0 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
2aed0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
2aee0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2aef0 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
2af00 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
2af10 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
2af20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
2af30 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
2af40 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
2af50 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
2af60 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
2af70 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
2af80 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
2af90 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2afa0 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
2afb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2afc0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 20  E_OR_SUBCLAUSE) 
2afd0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
2afe0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
2aff0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2b000 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
2b010 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
2b020 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2b030 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
2b040 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
2b050 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
2b060 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
2b070 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
2b080 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
2b090 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
2b0a0 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
2b0b0 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
2b0c0 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
2b0d0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
2b0e0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
2b0f0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
2b100 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
2b110 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
2b120 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
2b130 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
2b140 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
2b150 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
2b160 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
2b170 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
2b180 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
2b190 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
2b1a0 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
2b1b0 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
2b1c0 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
2b1d0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2b1e0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
2b1f0 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
2b200 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
2b210 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
2b220 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2b230 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2b240 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
2b250 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
2b260 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2b270 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
2b280 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
2b290 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
2b2a0 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
2b2b0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
2b2c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2b2d0 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57  By;.  pWInfo->pW
2b2e0 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
2b2f0 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
2b300 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74  Set = pResultSet
2b310 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ;.  pWInfo->aiCu
2b320 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57  rOnePass[0] = pW
2b330 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2b340 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57  ss[1] = -1;.  pW
2b350 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
2b360 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2b370 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e  o->iBreak = pWIn
2b380 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
2b390 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2b3a0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
2b3b0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b3c0 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
2b3d0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69  .  pWInfo->iLimi
2b3e0 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70  t = iAuxArg;.  p
2b3f0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2b400 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
2b410 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d  >nQueryLoop;.  m
2b420 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e  emset(&pWInfo->n
2b430 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20  OBSat, 0, .     
2b440 20 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65      offsetof(Whe
2b450 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66  reInfo,sWC) - of
2b460 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f  fsetof(WhereInfo
2b470 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d  ,nOBSat));.  mem
2b480 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30  set(&pWInfo->a[0
2b490 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65  ], 0, sizeof(Whe
2b4a0 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74  reLoop)+nTabList
2b4b0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
2b4c0 65 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el));.  assert( 
2b4d0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2b4e0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b  ==ONEPASS_OFF );
2b4f0 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66    /* ONEPASS def
2b500 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a  aults to OFF */.
2b510 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
2b520 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
2b530 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
2b540 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
2b550 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
2b560 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
2b570 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
2b580 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
2b590 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
2b5a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2b5b0 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
2b5c0 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
2b5d0 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
2b5e0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
2b5f0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
2b600 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
2b610 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
2b620 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
2b630 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
2b640 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
2b650 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
2b660 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
2b670 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
2b680 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
2b690 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
2b6a0 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
2b6b0 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
2b6c0 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
2b6d0 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
2b6e0 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69  sqlite3WhereSpli
2b6f0 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
2b700 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
2b710 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
2b720 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
2b730 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
2b740 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
2b750 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
2b760 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
2b770 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Sat = pOrderBy->
2b780 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77  nExpr;.    if( w
2b790 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2b7a0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
2b7b0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
2b7c0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
2b7d0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2b7e0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 78  UE;.    }.    Ex
2b7f0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
2b800 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e  pParse, 0, "SCAN
2b810 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 22 29 29   CONSTANT ROW"))
2b820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2b830 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
2b840 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
2b850 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
2b860 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b880 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66  The N-th term of
2b890 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b8a0 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62   is assigned a b
2b8b0 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a  itmask of 1<<N..
2b8c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2b8d0 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72  e rule of the pr
2b8e0 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
2b8f0 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20  ensures thta if 
2b900 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
2b910 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74 61   for.    ** a ta
2b920 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20  ble T, then X-1 
2b930 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
2b940 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62  or all other tab
2b950 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
2b960 6f 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f  of T..    ** Kno
2b970 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b  wing the bitmask
2b980 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2b990 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
2b9a0 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20   left join is.  
2b9b0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20    ** important. 
2b9c0 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
2b9d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
2b9e0 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
2b9f0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
2ba00 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
2ba10 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20  rc tables in.   
2ba20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
2ba30 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
2ba40 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
2ba50 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
2ba60 6f 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65  ormally.    ** e
2ba70 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
2ba80 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
2ba90 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
2baa0 20 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a   1 if the.    **
2bab0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2bac0 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  USE flag is set.
2bad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d  .    */.    ii =
2bae0 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
2baf0 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
2bb00 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2bb10 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2bb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
2bb30 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70  ereTabFuncArgs(p
2bb40 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74  Parse, &pTabList
2bb50 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f  ->a[ii], &pWInfo
2bb60 2d 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68 69  ->sWC);.    }whi
2bb70 6c 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c  le( (++ii)<pTabL
2bb80 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23  ist->nSrc );.  #
2bb90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2bba0 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 42  UG.    {.      B
2bbb0 69 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20  itmask mx = 0;. 
2bbc0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
2bbd0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2bbe0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2bbf0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c   Bitmask m = sql
2bc00 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
2bc10 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2bc20 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
2bc30 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
2bc40 65 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20  ert( m>=mx );.  
2bc50 20 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20        mx = m;.  
2bc60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65      }.    }.  #e
2bc70 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ndif.  }.  .  /*
2bc80 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
2bc90 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2bca0 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ns. */.  sqlite3
2bcb0 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65  WhereExprAnalyze
2bcc0 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
2bcd0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
2bce0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2bcf0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2bd00 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53  inError;..  /* S
2bd10 70 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48 45  pecial case: WHE
2bd20 52 45 20 74 65 72 6d 73 20 74 68 61 74 20 64 6f  RE terms that do
2bd30 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
2bd40 79 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  y tables in the 
2bd50 6a 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74  join.  ** (const
2bd60 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 29  ant expressions)
2bd70 2e 20 45 76 61 6c 75 61 74 65 20 65 61 63 68 20  . Evaluate each 
2bd80 73 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a  such term, and j
2bd90 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68 65  ump over all the
2bda0 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
2bdb0 63 6f 64 65 20 69 66 20 74 68 65 20 72 65 73 75  code if the resu
2bdc0 6c 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  lt is not true. 
2bdd0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e   .  **.  ** Do n
2bde0 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68  ot do this if th
2bdf0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
2be00 74 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d  tains non-determ
2be10 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
2be20 73 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20  s.  ** that are 
2be30 6e 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75 62  not within a sub
2be40 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73  -select. This is
2be50 20 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65   not strictly re
2be60 71 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a  quired, but.  **
2be70 20 70 72 65 73 65 72 76 65 73 20 53 51 4c 69 74   preserves SQLit
2be80 65 27 73 20 6c 65 67 61 63 79 20 62 65 68 61 76  e's legacy behav
2be90 69 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c  iour in the foll
2bea0 6f 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73 3a  owing two cases:
2beb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f  .  **.  **   FRO
2bec0 4d 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e 64  M ... WHERE rand
2bed0 6f 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20 20  om()>0;         
2bee0 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d    -- eval random
2bef0 28 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a  () once per row.
2bf00 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20    **   FROM ... 
2bf10 57 48 45 52 45 20 28 53 45 4c 45 43 54 20 72 61  WHERE (SELECT ra
2bf20 6e 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65  ndom())>0;  -- e
2bf30 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63  val random() onc
2bf40 65 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20  e overall.  */. 
2bf50 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
2bf60 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
2bf70 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54  i++){.    WhereT
2bf80 65 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e  erm *pT = &sWLB.
2bf90 70 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  pWC->a[ii];.    
2bfa0 69 66 28 20 70 54 2d 3e 77 74 46 6c 61 67 73 20  if( pT->wtFlags 
2bfb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
2bfc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bfd0 66 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c  f( pT->prereqAll
2bfe0 3d 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ==0 && (nTabList
2bff0 3d 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74  ==0 || exprIsDet
2c000 65 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70  erministic(pT->p
2c010 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20  Expr)) ){.      
2c020 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2c030 73 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70  se(pParse, pT->p
2c040 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  Expr, pWInfo->iB
2c050 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
2c060 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
2c070 70 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  pT->wtFlags |= T
2c080 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
2c090 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72  .  }..  if( wctr
2c0a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
2c0b0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
2c0c0 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
2c0d0 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
2c0e0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
2c0f0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
2c100 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
2c110 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
2c120 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
2c130 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
2c140 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
2c150 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2c160 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2c170 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
2c180 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
2c190 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
2c1a0 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
2c1b0 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
2c1c0 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
2c1d0 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
2c1e0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
2c1f0 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
2c200 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
2c210 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2c220 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
2c230 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
2c240 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
2c250 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2c260 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69  ects */.#if defi
2c270 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
2c280 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71  NABLED).  if( sq
2c290 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2c2a0 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  & 0xffff ){.    
2c2b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2c2c0 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  tf("*** Optimize
2c2d0 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74  r Start *** (wct
2c2e0 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77  rlFlags: 0x%x",w
2c2f0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
2c300 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2c310 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
2c320 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2c330 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20  3DebugPrintf(", 
2c340 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78  limit: %d", iAux
2c350 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
2c360 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2c370 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 20 20 69  tf(")\n");.    i
2c380 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2c390 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2c3a0 20 20 20 20 20 20 53 65 6c 65 63 74 20 73 53 65        Select sSe
2c3b0 6c 65 63 74 3b 0a 20 20 20 20 20 20 6d 65 6d 73  lect;.      mems
2c3c0 65 74 28 26 73 53 65 6c 65 63 74 2c 20 30 2c 20  et(&sSelect, 0, 
2c3d0 73 69 7a 65 6f 66 28 73 53 65 6c 65 63 74 29 29  sizeof(sSelect))
2c3e0 3b 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e  ;.      sSelect.
2c3f0 73 65 6c 46 6c 61 67 73 20 3d 20 53 46 5f 57 68  selFlags = SF_Wh
2c400 65 72 65 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ereBegin;.      
2c410 73 53 65 6c 65 63 74 2e 70 53 72 63 20 3d 20 70  sSelect.pSrc = p
2c420 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  TabList;.      s
2c430 53 65 6c 65 63 74 2e 70 57 68 65 72 65 20 3d 20  Select.pWhere = 
2c440 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 73 53  pWhere;.      sS
2c450 65 6c 65 63 74 2e 70 4f 72 64 65 72 42 79 20 3d  elect.pOrderBy =
2c460 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
2c470 20 73 53 65 6c 65 63 74 2e 70 45 4c 69 73 74 20   sSelect.pEList 
2c480 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
2c490 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2c4a0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 26 73 53  iewSelect(0, &sS
2c4b0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d  elect, 0);.    }
2c4c0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2c4d0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
2c4e0 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c  x100 ){ /* Displ
2c4f0 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ay all terms of 
2c500 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2c510 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
2c520 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28  hereClausePrint(
2c530 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d 0a 23  sWLB.pWC);.  }.#
2c540 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61  endif..  if( nTa
2c550 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72  bList!=1 || wher
2c560 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29  eShortCut(&sWLB)
2c570 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2c580 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
2c590 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20  &sWLB);.    if( 
2c5a0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  rc ) goto whereB
2c5b0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69  eginError;.  .#i
2c5c0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2c5d0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
2c5e0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2c5f0 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c  e ){    /* Displ
2c600 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
2c610 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2c620 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  */.      WhereLo
2c630 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74  op *p;.      int
2c640 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63   i;.      static
2c650 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62   const char zLab
2c660 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  el[] = "01234567
2c670 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  89abcdefghijklmn
2c680 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20  opqrstuvwyxz".  
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44             "ABCD
2c6c0 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
2c6d0 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66  UVWYXZ";.      f
2c6e0 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  or(p=pWInfo->pLo
2c6f0 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70  ops, i=0; p; p=p
2c700 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b  ->pNextLoop, i++
2c710 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49  ){.        p->cI
2c720 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 28 73 69  d = zLabel[i%(si
2c730 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2d 31 29 5d  zeof(zLabel)-1)]
2c740 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
2c750 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
2c760 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
2c770 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
2c780 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
2c790 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
2c7a0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2c7b0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2c7c0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2c7d0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2c7e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2c7f0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
2c800 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
2c810 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
2c820 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2c830 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2c840 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2c850 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
2c860 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2c870 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
2c880 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2c890 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
2c8a0 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
2c8b0 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49 54 53  evMask = ALLBITS
2c8c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
2c8d0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
2c8e0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
2c8f0 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
2c900 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2c910 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
2c920 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2c930 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2c940 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  eTrace ){.    sq
2c950 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2c960 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20  ("---- Solution 
2c970 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f  nRow=%d", pWInfo
2c980 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
2c990 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
2c9a0 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  at>0 ){.      sq
2c9b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2c9c0 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78  (" ORDERBY=%d,0x
2c9d0 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  %llx", pWInfo->n
2c9e0 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72  OBSat, pWInfo->r
2c9f0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  evMask);.    }. 
2ca00 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66     switch( pWInf
2ca10 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a  o->eDistinct ){.
2ca20 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2ca30 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2ca40 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
2ca50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2ca60 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75    DISTINCT=uniqu
2ca70 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  e");.        bre
2ca80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2ca90 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
2caa0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
2cab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cac0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
2cad0 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22  ISTINCT=ordered"
2cae0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2caf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cb00 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
2cb10 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b  NCT_UNORDERED: {
2cb20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cb30 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
2cb40 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65  ISTINCT=unordere
2cb50 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
2cb60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2cb70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
2cb80 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
2cb90 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2cba0 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
2cbb0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68   ii++){.      wh
2cbc0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49  ereLoopPrint(pWI
2cbd0 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f  nfo->a[ii].pWLoo
2cbe0 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
2cbf0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2cc00 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
2cc10 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
2cc20 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
2cc30 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  o not affect the
2cc40 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2a 20 46 6f   result..  ** Fo
2cc50 72 20 61 20 74 61 62 6c 65 20 74 6f 20 6e 6f 74  r a table to not
2cc60 20 61 66 66 65 63 74 20 74 68 65 20 72 65 73 75   affect the resu
2cc70 6c 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lt, the followin
2cc80 67 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a  g must be true:.
2cc90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 54    **.  **   1) T
2cca0 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f  he query must no
2ccb0 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
2ccc0 65 2e 0a 20 20 2a 2a 20 20 20 32 29 20 54 68 65  e..  **   2) The
2ccd0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 74   table must be t
2cce0 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45 46 54  he RHS of a LEFT
2ccf0 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 20 20 20 33 29   JOIN..  **   3)
2cd00 20 45 69 74 68 65 72 20 74 68 65 20 71 75 65 72   Either the quer
2cd10 79 20 6d 75 73 74 20 62 65 20 44 49 53 54 49 4e  y must be DISTIN
2cd20 43 54 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  CT, or else the 
2cd30 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2cd40 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d 75 73  se.  **      mus
2cd50 74 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6e 73  t contain a cons
2cd60 74 72 61 69 6e 74 20 74 68 61 74 20 6c 69 6d 69  traint that limi
2cd70 74 73 20 74 68 65 20 73 63 61 6e 20 6f 66 20 74  ts the scan of t
2cd80 68 65 20 74 61 62 6c 65 20 74 6f 20 0a 20 20 2a  he table to .  *
2cd90 2a 20 20 20 20 20 20 61 74 20 6d 6f 73 74 20 61  *      at most a
2cda0 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
2cdb0 2a 20 20 20 34 29 20 54 68 65 20 74 61 62 6c 65  *   4) The table
2cdc0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 72 65 66   must not be ref
2cdd0 65 72 65 6e 63 65 64 20 62 79 20 61 6e 79 20 70  erenced by any p
2cde0 61 72 74 20 6f 66 20 74 68 65 20 71 75 65 72 79  art of the query
2cdf0 20 61 70 61 72 74 0a 20 20 2a 2a 20 20 20 20 20   apart.  **     
2ce00 20 66 72 6f 6d 20 69 74 73 20 6f 77 6e 20 55 53   from its own US
2ce10 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61 75 73 65  ING or ON clause
2ce20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  **.  ** For 
2ce30 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 3a 0a  example, given:.
2ce40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
2ce50 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 69 70  EATE TABLE t1(ip
2ce60 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2ce70 59 20 4b 45 59 2c 20 76 31 29 3b 0a 20 20 2a 2a  Y KEY, v1);.  **
2ce80 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2ce90 45 20 74 32 28 69 70 6b 20 49 4e 54 45 47 45 52  E t2(ipk INTEGER
2cea0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 32   PRIMARY KEY, v2
2ceb0 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
2cec0 54 45 20 54 41 42 4c 45 20 74 33 28 69 70 6b 20  TE TABLE t3(ipk 
2ced0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2cee0 4b 45 59 2c 20 76 33 29 3b 0a 20 20 2a 2a 0a 20  KEY, v3);.  **. 
2cef0 20 2a 2a 20 74 68 65 6e 20 74 61 62 6c 65 20 74   ** then table t
2cf00 32 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  2 can be omitted
2cf10 20 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c 6f 77   from the follow
2cf20 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
2cf30 20 20 20 53 45 4c 45 43 54 20 76 31 2c 20 76 33     SELECT v1, v3
2cf40 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20   FROM t1 .  **  
2cf50 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2cf60 32 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d  2 USING (t1.ipk=
2cf70 74 32 2e 69 70 6b 29 0a 20 20 2a 2a 20 20 20 20  t2.ipk).  **    
2cf80 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20     LEFT JOIN t3 
2cf90 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33  USING (t1.ipk=t3
2cfa0 2e 69 70 6b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .ipk).  **.  ** 
2cfb0 6f 72 20 66 72 6f 6d 3a 0a 20 20 2a 2a 0a 20 20  or from:.  **.  
2cfc0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2cfd0 53 54 49 4e 43 54 20 76 31 2c 20 76 33 20 46 52  STINCT v1, v3 FR
2cfe0 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20 20 20  OM t1 .  **     
2cff0 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 0a 20    LEFT JOIN t2. 
2d000 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a   **       LEFT J
2d010 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31  OIN t3 USING (t1
2d020 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a  .ipk=t3.ipk).  *
2d030 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
2d040 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 69 66  (Bitmask)0;.  if
2d050 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2d060 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
2d070 74 53 65 74 21 3d 30 20 20 20 20 20 20 20 20 20  tSet!=0         
2d080 20 20 20 20 20 20 2f 2a 20 67 75 61 72 61 6e 74        /* guarant
2d090 65 65 73 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31  ees condition (1
2d0a0 29 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 26 26  ) above */.   &&
2d0b0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2d0c0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2d0d0 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20  OmitNoopJoin).  
2d0e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2d0f0 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65    Bitmask tabUse
2d100 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  d = sqlite3Where
2d110 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
2d120 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53  askSet, pResultS
2d130 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c  et);.    if( sWL
2d140 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  B.pOrderBy ){.  
2d150 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73      tabUsed |= s
2d160 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
2d170 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
2d180 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  t, sWLB.pOrderBy
2d190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
2d1a0 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
2d1b0 6c 2d 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b  l-1; i>=1; i--){
2d1c0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
2d1d0 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
2d1e0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2d1f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d200 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  ;.      pLoop = 
2d210 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 57 4c  pWInfo->a[i].pWL
2d220 6f 6f 70 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  oop;.      pItem
2d230 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
2d240 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
2d250 54 61 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Tab];.      if( 
2d260 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
2d270 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
2d280 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2d290 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2d2a0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
2d2b0 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
2d2c0 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
2d2d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d2e0 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
2d2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
2d300 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2d310 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64      if( (tabUsed
2d320 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
2d330 6c 66 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  lf)!=0 ) continu
2d340 65 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  e;.      pEnd = 
2d350 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
2d360 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
2d370 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
2d380 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
2d390 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
2d3a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2d3b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2d3c0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2d3d0 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f)!=0 ){.       
2d3e0 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
2d3f0 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
2d400 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
2d410 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
2d420 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 69   pTerm->pExpr->i
2d430 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
2d440 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20  pItem->iCursor. 
2d450 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2d460 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d470 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d490 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
2d4a0 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
2d4b0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
2d4c0 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
2d4d0 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
2d4e0 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
2d4f0 29 29 3b 0a 20 20 20 20 20 20 6e 6f 74 52 65 61  ));.      notRea
2d500 64 79 20 26 3d 20 7e 70 4c 6f 6f 70 2d 3e 6d 61  dy &= ~pLoop->ma
2d510 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
2d520 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
2d530 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
2d540 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2d550 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2d560 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
2d570 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2d580 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
2d590 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
2d5a0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20  RM_CODED;.      
2d5b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d5c0 20 20 69 66 28 20 69 21 3d 70 57 49 6e 66 6f 2d    if( i!=pWInfo-
2d5d0 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20  >nLevel-1 ){.   
2d5e0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2d5f0 20 28 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c   (pWInfo->nLevel
2d600 2d 31 2d 69 29 20 2a 20 73 69 7a 65 6f 66 28 57  -1-i) * sizeof(W
2d610 68 65 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20  hereLevel);.    
2d620 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 57 49      memmove(&pWI
2d630 6e 66 6f 2d 3e 61 5b 69 5d 2c 20 26 70 57 49 6e  nfo->a[i], &pWIn
2d640 66 6f 2d 3e 61 5b 69 2b 31 5d 2c 20 6e 42 79 74  fo->a[i+1], nByt
2d650 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2d660 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
2d670 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69  --;.      nTabLi
2d680 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st--;.    }.  }.
2d690 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
2d6a0 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
2d6b0 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
2d6c0 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  \n"));.  pWInfo-
2d6d0 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  >pParse->nQueryL
2d6e0 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e  oop += pWInfo->n
2d6f0 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66  RowOut;..  /* If
2d700 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
2d710 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2d720 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
2d730 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
2d740 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
2d750 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
2d760 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
2d770 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
2d780 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  te..  **.  ** A 
2d790 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63  one-pass approac
2d7a0 68 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  h can be used if
2d7b0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
2d7c0 72 65 71 75 65 73 74 65 64 20 6f 6e 65 0a 20 20  requested one.  
2d7d0 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 28 61  ** and either (a
2d7e0 29 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  ) the scan visit
2d7f0 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f  s at most one ro
2d800 77 20 6f 72 20 28 62 29 20 65 61 63 68 0a 20 20  w or (b) each.  
2d810 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
2d820 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
2d830 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20  **.  **   * the 
2d840 63 61 6c 6c 65 72 20 68 61 73 20 69 6e 64 69 63  caller has indic
2d850 61 74 65 64 20 74 68 61 74 20 61 20 6f 6e 65 2d  ated that a one-
2d860 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 63 61  pass approach ca
2d870 6e 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 20  n be used.  **  
2d880 20 20 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65     with multiple
2d890 20 72 6f 77 73 20 28 62 79 20 73 65 74 74 69 6e   rows (by settin
2d8a0 67 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  g WHERE_ONEPASS_
2d8b0 4d 55 4c 54 49 52 4f 57 29 2c 20 61 6e 64 0a 20  MULTIROW), and. 
2d8c0 20 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62 6c   **   * the tabl
2d8d0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 72 74 75  e is not a virtu
2d8e0 61 6c 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20  al table, and.  
2d8f0 2a 2a 20 20 20 2a 20 65 69 74 68 65 72 20 74 68  **   * either th
2d900 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20  e scan does not 
2d910 75 73 65 20 74 68 65 20 4f 52 20 6f 70 74 69 6d  use the OR optim
2d920 69 7a 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 63  ization or the c
2d930 61 6c 6c 65 72 0a 20 20 2a 2a 20 20 20 20 20 69  aller.  **     i
2d940 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61  s a DELETE opera
2d950 74 69 6f 6e 20 28 57 48 45 52 45 5f 44 55 50 4c  tion (WHERE_DUPL
2d960 49 43 41 54 45 53 5f 4f 4b 20 69 73 20 6f 6e 6c  ICATES_OK is onl
2d970 79 20 73 70 65 63 69 66 69 65 64 0a 20 20 2a 2a  y specified.  **
2d980 20 20 20 20 20 66 6f 72 20 44 45 4c 45 54 45 29       for DELETE)
2d990 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2d9a0 6c 61 73 74 20 71 75 61 6c 69 66 69 63 61 74 69  last qualificati
2d9b0 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  on is because an
2d9c0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
2d9d0 74 20 75 73 65 73 0a 20 20 2a 2a 20 57 68 65 72  t uses.  ** Wher
2d9e0 65 49 6e 66 6f 2e 61 69 43 75 72 4f 6e 65 50 61  eInfo.aiCurOnePa
2d9f0 73 73 5b 31 5d 20 74 6f 20 64 65 74 65 72 6d 69  ss[1] to determi
2da00 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2da10 74 20 69 74 20 72 65 61 6c 6c 79 20 63 61 6e 0a  t it really can.
2da20 20 20 2a 2a 20 75 73 65 20 61 20 6f 6e 65 2d 70    ** use a one-p
2da30 61 73 73 20 61 70 70 72 6f 61 63 68 2c 20 61 6e  ass approach, an
2da40 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 65  d this is not se
2da50 74 20 61 63 63 75 72 61 74 65 6c 79 20 66 6f 72  t accurately for
2da60 20 73 63 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   scans.  ** that
2da70 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70 74 69   use the OR opti
2da80 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  mization..  */. 
2da90 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
2daa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2dab0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2dac0 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
2dad0 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
2dae0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2daf0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2db00 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ED)!=0 ){.    in
2db10 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e  t wsFlags = pWIn
2db20 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
2db30 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e  >wsFlags;.    in
2db40 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46  t bOnerow = (wsF
2db50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2db60 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 61 73 73  ROW)!=0;.    ass
2db70 65 72 74 28 20 21 28 77 73 46 6c 61 67 73 20 26  ert( !(wsFlags &
2db80 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2db90 42 4c 45 29 20 7c 7c 20 49 73 56 69 72 74 75 61  BLE) || IsVirtua
2dba0 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  l(pTabList->a[0]
2dbb0 2e 70 54 61 62 29 20 29 3b 0a 20 20 20 20 69 66  .pTab) );.    if
2dbc0 28 20 62 4f 6e 65 72 6f 77 20 7c 7c 20 28 0a 20  ( bOnerow || (. 
2dbd0 20 20 20 20 20 20 20 30 21 3d 28 77 63 74 72 6c         0!=(wctrl
2dbe0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2dbf0 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 0a  EPASS_MULTIROW).
2dc00 20 20 20 20 20 26 26 20 21 49 73 56 69 72 74 75       && !IsVirtu
2dc10 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  al(pTabList->a[0
2dc20 5d 2e 70 54 61 62 29 0a 20 20 20 20 20 26 26 20  ].pTab).     && 
2dc30 28 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57  (0==(wsFlags & W
2dc40 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c  HERE_MULTI_OR) |
2dc50 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  | (wctrlFlags & 
2dc60 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
2dc70 5f 4f 4b 29 29 0a 20 20 20 20 29 29 7b 0a 20 20  _OK)).    )){.  
2dc80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65      pWInfo->eOne
2dc90 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f  Pass = bOnerow ?
2dca0 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20   ONEPASS_SINGLE 
2dcb0 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b  : ONEPASS_MULTI;
2dcc0 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
2dcd0 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  wid(pTabList->a[
2dce0 30 5d 2e 70 54 61 62 29 20 26 26 20 28 77 73 46  0].pTab) && (wsF
2dcf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2dd00 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
2dd10 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
2dd20 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2dd30 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20  _MULTIROW ){.   
2dd40 20 20 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74         bFordelet
2dd50 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45  e = OPFLAG_FORDE
2dd60 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LETE;.        }.
2dd70 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2dd80 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
2dd90 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20  lags = (wsFlags 
2dda0 26 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & ~WHERE_IDX_ONL
2ddb0 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Y);.      }.    
2ddc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  }.  }..  /* Open
2ddd0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
2dde0 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
2ddf0 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
2de00 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
2de10 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
2de20 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2de30 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  (ii=0, pLevel=pW
2de40 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62  Info->a; ii<nTab
2de50 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76  List; ii++, pLev
2de60 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
2de70 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
2de80 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
2de90 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
2dea0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2deb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2dec0 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78  ning table/index
2ded0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53   */.    struct S
2dee0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
2def0 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62  bItem;..    pTab
2df00 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2df10 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2df20 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
2df30 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2df40 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
2df50 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2df60 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2df70 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2df80 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
2df90 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2dfa0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2dfb0 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
2dfc0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
2dfd0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
2dfe0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
2dff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e000 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2e010 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2e020 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2e030 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
2e040 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2e050 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
2e060 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
2e070 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
2e080 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
2e090 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
2e0a0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2e0b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e0c0 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
2e0d0 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
2e0e0 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
2e0f0 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
2e100 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
2e110 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
2e120 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2e130 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2e140 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e150 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
2e160 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
2e170 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
2e180 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b  SUBCLAUSE)==0 ){
2e190 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2e1a0 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2e1b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
2e1c0 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
2e1d0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20  _OFF ){.        
2e1e0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
2e1f0 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
2e200 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2e210 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  0] = pTabItem->i
2e220 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b  Cursor;.      };
2e230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
2e240 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
2e250 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2e260 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
2e270 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e280 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2e290 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  or==pLevel->iTab
2e2a0 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Cur );.      tes
2e2b0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65  tcase( pWInfo->e
2e2c0 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2e2d0 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
2e2e0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
2e2f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
2e300 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2e310 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54  NEPASS_OFF && pT
2e320 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b  ab->nCol==BMS );
2e330 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2e340 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2e350 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
2e360 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61  ->nCol<BMS && Ha
2e370 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
2e380 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2e390 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
2e3a0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
2e3b0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
2e3c0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
2e3d0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
2e3e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e3f0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c  ngeP4(v, -1, SQL
2e400 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
2e410 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
2e420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
2e430 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
2e440 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2e450 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
2e460 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69  OR_HINTS.      i
2e470 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  f( pLoop->u.btre
2e480 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
2e490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e4a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2e4b0 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72  FLAG_SEEKEQ|bFor
2e4c0 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d  delete);.      }
2e4d0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2e4e0 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69    {.        sqli
2e4f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2e500 76 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  v, bFordelete);.
2e510 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2e520 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2e530 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
2e540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e550 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
2e560 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61  ColumnsUsed, pTa
2e570 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
2e580 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5a0 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54    (const u8*)&pT
2e5b0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c  abItem->colUsed,
2e5c0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
2e5d0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2e5e0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
2e5f0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
2e600 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
2e610 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
2e620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
2e630 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2e640 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
2e650 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
2e660 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2e670 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
2e680 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
2e690 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
2e6a0 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
2e6b0 2f 2a 20 69 41 75 78 41 72 67 20 69 73 20 61 6c  /* iAuxArg is al
2e6c0 77 61 79 73 20 73 65 74 20 74 6f 20 61 20 70 6f  ways set to a po
2e6d0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
2e6e0 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
2e6f0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2e700 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20  ert( iAuxArg!=0 
2e710 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
2e720 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2e730 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2e740 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2e750 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2e760 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
2e770 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
2e780 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2e790 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2e7a0 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29  AUSE)!=0.      )
2e7b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2e7c0 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66  s is one term of
2e7d0 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74   an OR-optimizat
2e7e0 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52  ion using the PR
2e7f0 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20  IMARY KEY of a. 
2e800 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55         ** WITHOU
2e810 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
2e820 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65  No need for a se
2e830 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a  parate index */.
2e840 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2e850 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
2e860 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Cur;.        op 
2e870 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2e880 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2e890 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2e8a0 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  FF ){.        In
2e8b0 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
2e8c0 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
2e8d0 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
2e8e0 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2e8f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
2e900 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e910 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2e920 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
2e930 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
2e940 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
2e950 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2e960 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
2e970 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
2e980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e990 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
2e9a0 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
2e9b0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2e9c0 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
2e9d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e9e0 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72  iAuxArg && (wctr
2e9f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2ea00 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
2ea10 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  ){.        iInde
2ea20 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2ea30 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2ea40 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20  ReopenIdx;.     
2ea50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ea60 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72  iIndexCur = pPar
2ea70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2ea80 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
2ea90 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64  ->iIdxCur = iInd
2eaa0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  exCur;.      ass
2eab0 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
2eac0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
2ead0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2eae0 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
2eaf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29  ;.      if( op )
2eb00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2eb10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
2eb20 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
2eb30 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
2eb40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2eb50 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
2eb60 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
2eb70 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
2eb80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2eb90 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a  _CONSTRAINT)!=0.
2eba0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
2ebb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
2ebc0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2ebd0 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  E|WHERE_SKIPSCAN
2ebe0 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ))==0.         &
2ebf0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2ec00 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
2ec10 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20  RBY_MIN)==0.    
2ec20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
2ec30 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45  eDistinct!=WHERE
2ec40 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2ec50 44 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  D.        ){.   
2ec60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ec70 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2ec80 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
2ec90 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
2eca0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
2ecb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ecc0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
2ecd0 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
2ece0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2ecf0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
2ed00 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2ed10 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
2ed20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2ed30 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
2ed40 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2ed50 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
2ed60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2ed70 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
2ed80 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
2ed90 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
2eda0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2edb0 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
2edc0 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
2edd0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
2ede0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
2edf0 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
2ee00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ee10 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
2ee20 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
2ee30 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
2ee40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ee50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ee60 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2ee70 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2ee80 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
2ee90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eeb0 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
2eec0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
2eed0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
2eee0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2eef0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
2ef00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ef10 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
2ef20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2ef30 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2ef40 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
2ef50 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2ef60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2ef70 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2ef80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2ef90 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2efa0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2efb0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2efc0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2efd0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2efe0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2eff0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2f000 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2f010 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2f020 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2f030 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2f040 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54   for(ii=0; ii<nT
2f050 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20  abList; ii++){. 
2f060 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61     int addrExpla
2f070 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c  in;.    int wsFl
2f080 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ags;.    pLevel 
2f090 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
2f0a0 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20  ;.    wsFlags = 
2f0b0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2f0c0 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66  wsFlags;.#ifndef
2f0d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2f0e0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
2f0f0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57   if( (pLevel->pW
2f100 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2f110 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
2f120 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2f130 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
2f140 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70  Index(pParse, &p
2f150 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20  WInfo->sWC,.    
2f160 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
2f170 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2f180 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64  >iFrom], notRead
2f190 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
2f1a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2f1b0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2f1c0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2f1d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2f1e0 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71  addrExplain = sq
2f1f0 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61 69  lite3WhereExplai
2f200 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
2f210 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69    pParse, pTabLi
2f220 73 74 2c 20 70 4c 65 76 65 6c 2c 20 77 63 74 72  st, pLevel, wctr
2f230 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20  lFlags.    );.  
2f240 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f    pLevel->addrBo
2f250 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
2f260 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2f270 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73      notReady = s
2f280 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f  qlite3WhereCodeO
2f290 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 50 61 72  neLoopStart(pPar
2f2a0 73 65 2c 76 2c 70 57 49 6e 66 6f 2c 69 69 2c 70  se,v,pWInfo,ii,p
2f2b0 4c 65 76 65 6c 2c 6e 6f 74 52 65 61 64 79 29 3b  Level,notReady);
2f2c0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  .    pWInfo->iCo
2f2d0 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d  ntinue = pLevel-
2f2e0 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69  >addrCont;.    i
2f2f0 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52  f( (wsFlags&WHER
2f300 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26  E_MULTI_OR)==0 &
2f310 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  & (wctrlFlags&WH
2f320 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2f330 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
2f340 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61  lite3WhereAddSca
2f350 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c  nStatus(v, pTabL
2f360 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64  ist, pLevel, add
2f370 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d  rExplain);.    }
2f380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e  .  }..  /* Done.
2f390 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2f3a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
2f3b0 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  in WHERE-core"))
2f3c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
2f3d0 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
2f3e0 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
2f3f0 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
2f400 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
2f410 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
2f420 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
2f430 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2f440 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
2f450 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
2f460 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
2f470 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2f480 20 50 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33   Part of sqlite3
2f490 57 68 65 72 65 45 6e 64 28 29 20 77 69 6c 6c 20  WhereEnd() will 
2f4a0 72 65 77 72 69 74 65 20 6f 70 63 6f 64 65 73 20  rewrite opcodes 
2f4b0 74 6f 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  to reference the
2f4c0 0a 2a 2a 20 69 6e 64 65 78 20 72 61 74 68 65 72  .** index rather
2f4d0 20 74 68 61 6e 20 74 68 65 20 6d 61 69 6e 20 74   than the main t
2f4e0 61 62 6c 65 2e 20 20 49 6e 20 53 51 4c 49 54 45  able.  In SQLITE
2f4f0 5f 44 45 42 55 47 20 6d 6f 64 65 2c 20 77 65 20  _DEBUG mode, we 
2f500 77 61 6e 74 0a 2a 2a 20 74 6f 20 74 72 61 63 65  want.** to trace
2f510 20 74 68 6f 73 65 20 63 68 61 6e 67 65 73 20 69   those changes i
2f520 66 20 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64  f PRAGMA vdbe_ad
2f530 64 6f 70 74 72 61 63 65 3d 6f 6e 2e 20 20 54 68  doptrace=on.  Th
2f540 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
2f550 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 6e  es that..*/.#ifn
2f560 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2f570 0a 23 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65  .# define Opcode
2f580 52 65 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b  RewriteTrace(D,K
2f590 2c 50 29 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  ,P) /* no-op */.
2f5a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4f  #else.# define O
2f5b0 70 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63  pcodeRewriteTrac
2f5c0 65 28 44 2c 4b 2c 50 29 20 73 71 6c 69 74 65 33  e(D,K,P) sqlite3
2f5d0 57 68 65 72 65 4f 70 63 6f 64 65 52 65 77 72 69  WhereOpcodeRewri
2f5e0 74 65 54 72 61 63 65 28 44 2c 4b 2c 50 29 0a 20  teTrace(D,K,P). 
2f5f0 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c   static void sql
2f600 69 74 65 33 57 68 65 72 65 4f 70 63 6f 64 65 52  ite3WhereOpcodeR
2f610 65 77 72 69 74 65 54 72 61 63 65 28 0a 20 20 20  ewriteTrace(.   
2f620 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
2f630 20 20 69 6e 74 20 70 63 2c 0a 20 20 20 20 56 64    int pc,.    Vd
2f640 62 65 4f 70 20 2a 70 4f 70 0a 20 20 29 7b 0a 20  beOp *pOp.  ){. 
2f650 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
2f660 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
2f670 64 64 6f 70 54 72 61 63 65 29 3d 3d 30 20 29 20  ddopTrace)==0 ) 
2f680 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
2f690 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
2f6a0 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20 20 7d 0a  , pc, pOp);.  }.
2f6b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
2f6c0 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
2f6d0 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
2f6e0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
2f6f0 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
2f700 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
2f710 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2f720 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
2f730 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
2f740 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2f750 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
2f760 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
2f770 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
2f780 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2f790 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
2f7a0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
2f7b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2f7c0 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  p;.  SrcList *pT
2f7d0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2f7e0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
2f7f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2f800 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
2f810 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
2f820 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
2f830 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
2f840 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57  mment((v, "End W
2f850 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
2f860 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
2f870 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
2f880 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
2f890 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
2f8a0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
2f8b0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2f8c0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
2f8d0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
2f8e0 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  _Noop ){.#ifndef
2f8f0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2f900 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e  SKIPAHEAD_DISTIN
2f910 43 54 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  CT.      int add
2f920 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20  rSeek = 0;.     
2f930 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
2f940 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2f950 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69   if( pWInfo->eDi
2f960 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
2f970 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20  STINCT_ORDERED. 
2f980 20 20 20 20 20 20 26 26 20 69 3d 3d 70 57 49 6e        && i==pWIn
2f990 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a  fo->nLevel-1  /*
2f9a0 20 54 69 63 6b 65 74 20 5b 65 66 39 33 31 38 37   Ticket [ef93187
2f9b0 35 37 62 31 35 32 65 33 5d 20 32 30 31 37 2d 31  57b152e3] 2017-1
2f9c0 30 2d 32 31 20 2a 2f 0a 20 20 20 20 20 20 20 26  0-21 */.       &
2f9d0 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2f9e0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2f9f0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
2fa00 28 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  (pIdx = pLoop->u
2fa10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e  .btree.pIndex)->
2fa20 68 61 73 53 74 61 74 31 0a 20 20 20 20 20 20 20  hasStat1.       
2fa30 26 26 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75  && (n = pLoop->u
2fa40 2e 62 74 72 65 65 2e 6e 44 69 73 74 69 6e 63 74  .btree.nDistinct
2fa50 43 6f 6c 29 3e 30 0a 20 20 20 20 20 20 20 26 26  Col)>0.       &&
2fa60 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
2fa70 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20 20 20 20 20  st[n]>=36.      
2fa80 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
2fa90 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
2faa0 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +1;.        int 
2fab0 6a 2c 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 66  j, op;.        f
2fac0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2fad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2fae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2faf0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4c 65  , OP_Column, pLe
2fb00 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6a 2c  vel->iIdxCur, j,
2fb10 20 72 31 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20   r1+j);.        
2fb20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
2fb30 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a 20  ->nMem += n+1;. 
2fb40 20 20 20 20 20 20 20 6f 70 20 3d 20 70 4c 65 76         op = pLev
2fb50 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 20  el->op==OP_Prev 
2fb60 3f 20 4f 50 5f 53 65 65 6b 4c 54 20 3a 20 4f 50  ? OP_SeekLT : OP
2fb70 5f 53 65 65 6b 47 54 3b 0a 20 20 20 20 20 20 20  _SeekGT;.       
2fb80 20 61 64 64 72 53 65 65 6b 20 3d 20 73 71 6c 69   addrSeek = sqli
2fb90 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2fba0 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  (v, op, pLevel->
2fbb0 69 49 64 78 43 75 72 2c 20 30 2c 20 72 31 2c 20  iIdxCur, 0, r1, 
2fbc0 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  n);.        Vdbe
2fbd0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
2fbe0 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20  ==OP_SeekLT);.  
2fbf0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2fc00 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
2fc10 65 65 6b 47 54 29 3b 0a 20 20 20 20 20 20 20 20  eekGT);.        
2fc20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fc30 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c  2(v, OP_Goto, 1,
2fc40 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
2fc50 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
2fc60 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53  SQLITE_DISABLE_S
2fc70 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43  KIPAHEAD_DISTINC
2fc80 54 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  T */.      /* Th
2fc90 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41  e common case: A
2fca0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
2fcb0 78 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  xt row */.      
2fcc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2fcd0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2fce0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
2fcf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fd00 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp3(v, pLevel-
2fd10 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
2fd20 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65   pLevel->p2, pLe
2fd30 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  vel->p3);.      
2fd40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2fd50 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
2fd60 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  5);.      VdbeCo
2fd70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2fd80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2fd90 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2fda0 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56  P_Next);.      V
2fdb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2fdc0 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2fdd0 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62  Prev);.      Vdb
2fde0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2fdf0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e  Level->op==OP_VN
2fe00 65 78 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ext);.#ifndef SQ
2fe10 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49  LITE_DISABLE_SKI
2fe20 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a  PAHEAD_DISTINCT.
2fe30 20 20 20 20 20 20 69 66 28 20 61 64 64 72 53 65        if( addrSe
2fe40 65 6b 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ek ) sqlite3Vdbe
2fe50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2fe60 53 65 65 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Seek);.#endif.  
2fe70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2fe80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2fe90 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2fea0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
2feb0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2fec0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2fed0 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
2fee0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
2fef0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2ff00 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
2ff10 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2ff20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2ff30 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2ff40 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
2ff50 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
2ff60 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
2ff70 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
2ff80 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
2ff90 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
2ffa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ffb0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2ffc0 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
2ffd0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e         if( pIn->
2ffe0 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e  eEndLoopOp!=OP_N
2fff0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oop ){.         
30000 20 69 66 28 20 70 49 6e 2d 3e 6e 50 72 65 66 69   if( pIn->nPrefi
30010 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x ){.           
30020 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
30030 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30040 49 4e 5f 45 41 52 4c 59 4f 55 54 20 29 3b 0a 20  IN_EARLYOUT );. 
30050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30060 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
30070 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f 70 65 2c 20  v, OP_IfNoHope, 
30080 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
30090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
300b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
300c0 74 41 64 64 72 28 76 29 2b 32 2c 0a 20 20 20 20  tAddr(v)+2,.    
300d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300e0 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
300f0 42 61 73 65 2c 20 70 49 6e 2d 3e 6e 50 72 65 66  Base, pIn->nPref
30100 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ix);.           
30110 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30140 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
30150 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
30160 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
30170 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
30180 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
30190 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  (v);.          V
301a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
301b0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
301c0 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
301d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
301e0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
301f0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
30200 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30220 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
30230 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
30240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
30250 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30260 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
30270 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
30280 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
30290 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
302a0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
302b0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
302c0 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  kip);.      Vdbe
302d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
302e0 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  t skip-scan on %
302f0 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  s", pLoop->u.btr
30300 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
30310 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30320 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
30330 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
30340 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
30350 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
30360 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
30370 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  p-2);.    }.#ifn
30380 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
30390 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
303a0 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  BS.    if( pLeve
303b0 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29  l->addrLikeRep )
303c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
303d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
303e0 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69  DecrJumpZero, (i
303f0 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
30400 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20  eRepCntr>>1),.  
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30420 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
30430 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20  drLikeRep);.    
30440 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
30450 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
30460 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30470 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
30480 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
30490 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
304a0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
304b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
304c0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
304d0 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
304e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
304f0 20 20 20 61 73 73 65 72 74 28 20 28 77 73 20 26     assert( (ws &
30500 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
30510 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45  ==0 || (ws & WHE
30520 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
30530 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  ;.      if( (ws 
30540 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
30550 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30560 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
30570 69 54 61 62 43 75 72 3d 3d 70 54 61 62 4c 69 73  iTabCur==pTabLis
30580 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
30590 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20  om].iCursor );. 
305a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
305b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
305c0 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
305d0 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20  iTabCur);.      
305e0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
305f0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
30600 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73   .       || ((ws
30610 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
30620 52 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  R) && pLevel->u.
30630 70 43 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20  pCovidx) .      
30640 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30650 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30660 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
30670 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
30680 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30690 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
306a0 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
306b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
306c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
306d0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
306e0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
306f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30710 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
30720 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
30730 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30740 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
30750 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
30760 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
30770 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
30780 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
30790 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
307a0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
307b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
307c0 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
307d0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
307e0 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
307f0 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
30800 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
30810 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
30820 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
30830 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
30840 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30850 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
30860 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
30870 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
30880 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
30890 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
308a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
308b0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
308c0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
308d0 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
308e0 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
308f0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
30900 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
30910 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30920 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
30930 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
30940 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
30950 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
30960 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
30970 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
30980 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
30990 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
309a0 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
309b0 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
309c0 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
309d0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
309e0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
309f0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
30a00 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
30a10 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
30a20 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
30a30 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
30a40 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
30a50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
30a60 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
30a70 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
30a80 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
30a90 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
30aa0 65 64 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e  ed );.      tran
30ab0 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70  slateColumnToCop
30ac0 79 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  y(pParse, pLevel
30ad0 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76  ->addrBody, pLev
30ae0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20  el->iTabCur,.   
30af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b00 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
30b10 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29  m->regResult, 0)
30b20 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
30b30 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
30b40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 41  SQLITE_ENABLE_EA
30b50 52 4c 59 5f 43 55 52 53 4f 52 5f 43 4c 4f 53 45  RLY_CURSOR_CLOSE
30b60 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  .    /* Close al
30b70 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
30b80 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
30b90 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
30ba0 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45  eBegin..    ** E
30bb0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c  xcept, do not cl
30bc0 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  ose cursors that
30bd0 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20   will be reused 
30be0 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  by the OR optimi
30bf0 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57  zation.    ** (W
30c00 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
30c10 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20  E).  And do not 
30c20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65  close the OP_Ope
30c30 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20  nWrite cursors. 
30c40 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f     ** created fo
30c50 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  r the ONEPASS op
30c60 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
30c70 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  */.    if( (pTab
30c80 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
30c90 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20  Ephemeral)==0.  
30ca0 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c     && pTab->pSel
30cb0 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ect==0.     && (
30cc0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
30cd0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
30ce0 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20  BCLAUSE)==0.    
30cf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
30d00 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
30d10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
30d20 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
30d30 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73  EPASS_OFF && (ws
30d40 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30d50 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
30d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30d70 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
30d80 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
30d90 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
30da0 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
30db0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
30dc0 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28 57       && (ws & (W
30dd0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41  HERE_IPK|WHERE_A
30de0 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a  UTO_INDEX))==0 .
30df0 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c         && pLevel
30e00 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66  ->iIdxCur!=pWInf
30e10 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
30e20 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1].      ){.    
30e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30e40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
30e50 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
30e60 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
30e70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
30e80 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
30e90 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
30ea0 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62  ke VDBE code sub
30eb0 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
30ec0 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
30ed0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
30ee0 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68  stead of from th
30ef0 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f  e table where po
30f00 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65  ssible.  In some
30f10 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68   cases.    ** th
30f20 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
30f30 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62  prevents the tab
30f40 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69  le from ever bei
30f50 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63  ng read, which c
30f60 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20  an.    ** yield 
30f70 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65  a significant pe
30f80 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
30f90 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
30fa0 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
30fb0 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
30fc0 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
30fd0 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
30fe0 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
30ff0 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
31000 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
31010 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
31020 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
31030 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
31040 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
31050 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
31060 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
31070 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
31080 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
31090 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
310a0 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
310b0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
310c0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
310d0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
310e0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
310f0 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44  INDEXED|WHERE_ID
31100 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
31110 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
31120 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
31130 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
31140 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
31150 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
31160 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
31170 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
31180 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
31190 64 78 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  dx.     && (pWIn
311a0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
311b0 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61  EPASS_OFF || !Ha
311c0 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61  sRowid(pIdx->pTa
311d0 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20 21 64  ble)).     && !d
311e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
311f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73      ){.      las
31200 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
31210 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
31220 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d       k = pLevel-
31230 3e 61 64 64 72 42 6f 64 79 3b 0a 23 69 66 64 65  >addrBody;.#ifde
31240 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
31250 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61       if( db->fla
31260 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
31270 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
31280 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 54 52        printf("TR
31290 41 4e 53 4c 41 54 45 20 6f 70 63 6f 64 65 73 20  ANSLATE opcodes 
312a0 69 6e 20 72 61 6e 67 65 20 25 64 2e 2e 25 64 5c  in range %d..%d\
312b0 6e 22 2c 20 6b 2c 20 6c 61 73 74 2d 31 29 3b 0a  n", k, last-1);.
312c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
312d0 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
312e0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b  e3VdbeGetOp(v, k
312f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b  );.      for(; k
31300 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
31310 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
31320 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
31330 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
31340 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
31350 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
31360 5f 43 6f 6c 75 6d 6e 0a 23 69 66 64 65 66 20 53  _Column.#ifdef S
31370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
31380 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20  SET_SQL_FUNC.   
31390 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70        || pOp->op
313a0 63 6f 64 65 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a  code==OP_Offset.
313b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29  #endif.        )
313c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
313d0 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  x = pOp->p2;.   
313e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
313f0 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61  Idx->pTable==pTa
31400 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  b );.          i
31410 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
31420 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
31430 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
31440 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
31450 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
31460 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b           x = pPk
31470 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20  ->aiColumn[x];. 
31480 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
31490 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
314a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
314b0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
314c0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
314d0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
314e0 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
314f0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
31500 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
31510 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
31520 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
31530 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72        OpcodeRewr
31540 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20  iteTrace(db, k, 
31550 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
31560 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
31570 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
31580 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
31590 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
315a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
315b0 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  || pWInfo->eOneP
315c0 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ass );.        }
315d0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
315e0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
315f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
31600 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
31610 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
31620 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
31630 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
31640 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72        OpcodeRewr
31650 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20  iteTrace(db, k, 
31660 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  pOp);.        }e
31670 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
31680 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52 6f  ode==OP_IfNullRo
31690 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
316a0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
316b0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
316c0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
316d0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
316e0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
316f0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
31700 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
31710 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
31720 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
31730 54 72 61 63 65 20 29 20 70 72 69 6e 74 66 28 22  Trace ) printf("
31740 54 52 41 4e 53 4c 41 54 45 20 63 6f 6d 70 6c 65  TRANSLATE comple
31750 74 65 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20  te\n");.#endif. 
31760 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
31770 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
31780 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
31790 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
317a0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
317b0 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
317c0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
317d0 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.