/ Hex Artifact Content
Login

Artifact c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 49 6e 20 74 68 65 20 4f 52 44 45 52 20  ** In the ORDER 
08e0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
08f0: 61 74 69 6f 6e 2c 20 69 66 20 74 68 65 20 69 6e  ation, if the in
0900: 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 73  ner-most loop is
0910: 20 6b 6e 6f 77 6e 0a 2a 2a 20 74 6f 20 65 6d 69   known.** to emi
0920: 74 20 72 6f 77 73 20 69 6e 20 69 6e 63 72 65 61  t rows in increa
0930: 73 69 6e 67 20 6f 72 64 65 72 2c 20 61 6e 64 20  sing order, and 
0940: 69 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  if the last row 
0950: 65 6d 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a  emitted by the.*
0960: 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  * inner-most loo
0970: 70 20 64 69 64 20 6e 6f 74 20 66 69 74 20 77 69  p did not fit wi
0980: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  thin the sorter,
0990: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 73 6b 69   then we can ski
09a0: 70 20 61 6c 6c 0a 2a 2a 20 73 75 62 73 65 71 75  p all.** subsequ
09b0: 65 6e 74 20 72 6f 77 73 20 66 6f 72 20 74 68 65  ent rows for the
09c0: 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69   current iterati
09d0: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  on of the inner 
09e0: 6c 6f 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  loop (because th
09f0: 65 79 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  ey.** will not f
0a00: 69 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  it in the sorter
0a10: 20 65 69 74 68 65 72 29 20 61 6e 64 20 63 6f 6e   either) and con
0a20: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 73  tinue with the s
0a30: 65 63 6f 6e 64 20 69 6e 6e 65 72 0a 2a 2a 20 6c  econd inner.** l
0a40: 6f 6f 70 20 2d 20 74 68 65 20 6c 6f 6f 70 20 69  oop - the loop i
0a50: 6d 6d 65 64 69 61 74 65 6c 79 20 6f 75 74 73 69  mmediately outsi
0a60: 64 65 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  de the inner-mos
0a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  t..**.** When a 
0a80: 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  row does not fit
0a90: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 28   in the sorter (
0aa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 6f 72 74  because the sort
0ab0: 65 72 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  er already.** ho
0ac0: 6c 64 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  lds LIMIT+OFFSET
0ad0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 73   rows that are s
0ae0: 6d 61 6c 6c 65 72 29 2c 20 74 68 65 6e 20 61 20  maller), then a 
0af0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
0b00: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 72 65 74  the.** label ret
0b10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
0b20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
0b30: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
0b40: 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  MIT optimization
0b50: 20 61 70 70 6c 69 65 73 2c 20 74 68 65 20 6a 75   applies, the ju
0b60: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73  mp destination s
0b70: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20  hould.** be the 
0b80: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72  continuation for
0b90: 20 74 68 65 20 73 65 63 6f 6e 64 2d 69 6e 6e 65   the second-inne
0ba0: 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20 20 49 66  r-most loop.  If
0bb0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
0bc0: 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74   LIMIT optimizat
0bd0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ion does not app
0be0: 6c 79 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ly, then the jum
0bf0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 68  p destination sh
0c00: 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20 63  ould.** be the c
0c10: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72 20  ontinuation for 
0c20: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
0c30: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  oop..**.** It is
0c40: 20 61 6c 77 61 79 73 20 73 61 66 65 20 66 6f 72   always safe for
0c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
0c60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74   return the cont
0c70: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  inuation of the.
0c80: 2a 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  ** inner-most lo
0c90: 6f 70 2c 20 69 6e 20 74 68 65 20 73 65 6e 73 65  op, in the sense
0ca0: 20 74 68 61 74 20 61 20 63 6f 72 72 65 63 74 20   that a correct 
0cb0: 61 6e 73 77 65 72 20 77 69 6c 6c 20 72 65 73 75  answer will resu
0cc0: 6c 74 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 69  lt.  .** Returni
0cd0: 6e 67 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ng the continuat
0ce0: 69 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ion the second i
0cf0: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 61 6e 20  nner loop is an 
0d00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0d10: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 6b 65 20  that might make 
0d20: 74 68 65 20 63 6f 64 65 20 72 75 6e 20 61 20 6c  the code run a l
0d30: 69 74 74 6c 65 20 66 61 73 74 65 72 2c 20 62 75  ittle faster, bu
0d40: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  t should not cha
0d50: 6e 67 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  nge.** the final
0d60: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
0d70: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
0d80: 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c  rByLimitOptLabel
0d90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0da0: 66 6f 29 7b 0a 20 20 57 68 65 72 65 4c 65 76 65  fo){.  WhereLeve
0db0: 6c 20 2a 70 49 6e 6e 65 72 3b 0a 20 20 69 66 28  l *pInner;.  if(
0dc0: 20 21 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72   !pWInfo->bOrder
0dd0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
0de0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
0df0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
0e00: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
0e10: 70 70 6c 79 2e 20 20 4a 75 6d 70 20 74 6f 20 74  pply.  Jump to t
0e20: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 69  he .    ** conti
0e30: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  nuation of the i
0e40: 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20  nner-most loop. 
0e50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 57  */.    return pW
0e60: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
0e70: 0a 20 20 7d 0a 20 20 70 49 6e 6e 65 72 20 3d 20  .  }.  pInner = 
0e80: 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66  &pWInfo->a[pWInf
0e90: 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 3b 0a 20 20  o->nLevel-1];.  
0ea0: 61 73 73 65 72 74 28 20 70 49 6e 6e 65 72 2d 3e  assert( pInner->
0eb0: 61 64 64 72 4e 78 74 21 3d 30 20 29 3b 0a 20 20  addrNxt!=0 );.  
0ec0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ed0: 64 64 72 4e 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrNxt;.}../*.**
0ee0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0ef0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f00: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f10: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f20: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f30: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f40: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f50: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f60: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f70: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f80: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0f90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fa0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fb0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fc0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0fe0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
0ff0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1000: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1010: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1020: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1030: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1040: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1050: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1060: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1070: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1080: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
1090: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10b0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10c0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10d0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
10f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1100: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1110: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1140: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1150: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1160: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1170: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1180: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
1190: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11b0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11c0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11d0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11e0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
11f0: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1200: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1210: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1220: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1230: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1240: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1250: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1260: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1270: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1280: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
1290: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12a0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12b0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12c0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12d0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
12f0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1300: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1310: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1320: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1330: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1340: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1350: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1360: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1370: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1380: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
1390: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13a0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13d0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
13f0: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1400: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1410: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1420: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1430: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1440: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1450: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1460: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1470: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1480: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
1490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14a0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14c0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14d0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14e0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
14f0: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1500: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1510: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1520: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1530: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1540: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1560: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1570: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1580: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
1590: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15a0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15b0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15c0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15d0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15e0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
15f0: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1600: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1610: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1620: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1630: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1640: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1650: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1660: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1670: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1680: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
1690: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16a0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16b0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16c0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16d0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16e0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
16f0: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1700: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1710: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1720: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1730: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1740: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1750: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1760: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1770: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1780: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
1790: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17a0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17b0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17c0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17d0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17e0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
17f0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1810: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1820: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1830: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1840: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1850: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1860: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1870: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1880: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
1890: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18a0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18b0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18c0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18d0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18e0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
18f0: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1900: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1910: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1930: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1940: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1950: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1960: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1970: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1990: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19a0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19d0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19e0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
19f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a00: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a10: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a20: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a30: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a40: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a50: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a60: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a70: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1a90: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1aa0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ab0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ac0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ad0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1ae0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1af0: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b00: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b30: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b40: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b50: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b60: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b70: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1b90: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1ba0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bc0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1be0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1bf0: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c00: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c10: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c20: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c40: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c50: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c70: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c80: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1c90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1ca0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cb0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cc0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1cd0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1ce0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1cf0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d00: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d10: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d20: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d40: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d50: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d60: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d70: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d80: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1da0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1db0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dc0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1dd0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1de0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1df0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e00: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e10: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e20: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e30: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e40: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e50: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e70: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e80: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1e90: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ec0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ed0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ee0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1ef0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f00: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f10: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f20: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f40: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f50: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f60: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f70: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f80: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1f90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fa0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fb0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fc0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fd0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1fe0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
1ff0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2000: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2010: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2020: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2030: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2050: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2060: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2070: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2080: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
2090: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20a0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20b0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20c0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20d0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20e0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
20f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2110: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2120: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2130: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2140: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2150: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2170: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2180: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
2190: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21c0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21d0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21e0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
21f0: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2200: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2210: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2220: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2250: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2260: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2270: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2280: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
2290: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22a0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
22c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
22d0: 67 68 74 29 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ght))->op==TK_CO
22e0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 29  LUMN.          )
22f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2300: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
2310: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61   for(j=0; j<pSca
2320: 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 2b 29 7b  n->nEquiv; j++){
2330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2340: 66 28 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  f( pScan->aiCur[
2350: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2370: 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e   pScan->aiColumn
2380: 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  [j]==pX->iColumn
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23d0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
23e0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
2400: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 20 3d 20 70  an->aiCur[j] = p
2410: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
2420: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2430: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58  aiColumn[j] = pX
2440: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2450: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2460: 6e 45 71 75 69 76 2b 2b 3b 0a 20 20 20 20 20 20  nEquiv++;.      
2470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2480: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2490: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
24a0: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
24b0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
24c0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
24d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
24e0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
24f0: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
2500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2510: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
2520: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
2530: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
2540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2550: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2560: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2570: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
2580: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
2590: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
25a0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
25b0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
25c0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
25d0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
25e0: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
25f0: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
2600: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2610: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2630: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
2640: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2650: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2660: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2670: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20  llSeq(pParse,.  
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
26c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
26d0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
26e0: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  =0 ) pColl = pPa
26f0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2700: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2720: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2730: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
2740: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
2750: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2770: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2780: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2790: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27a0: 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
27b0: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
27c0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
27d0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
27e0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2800: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
2810: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 0a 20 20 20  an->aiCur[0].   
2820: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
2830: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
2840: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20  >aiColumn[0].   
2850: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2860: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2870: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
2880: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28c0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
28d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC;.            
28e0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a  pScan->k = k+1;.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2900: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
2930: 43 20 3d 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b  C = pWC->pOuter;
2940: 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  .      k = 0;.  
2950: 20 20 7d 77 68 69 6c 65 28 20 70 57 43 21 3d 30    }while( pWC!=0
2960: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 61   );.    if( pSca
2970: 6e 2d 3e 69 45 71 75 69 76 3e 3d 70 53 63 61 6e  n->iEquiv>=pScan
2980: 2d 3e 6e 45 71 75 69 76 20 29 20 62 72 65 61 6b  ->nEquiv ) break
2990: 3b 0a 20 20 20 20 70 57 43 20 3d 20 70 53 63 61  ;.    pWC = pSca
29a0: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
29b0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
29c0: 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20 7d 0a  ->iEquiv++;.  }.
29d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29e0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
29f0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
2a00: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
2a10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2a20: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
2a30: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
2a40: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
2a50: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
2a60: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
2a70: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
2a80: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
2a90: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
2aa0: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
2ab0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
2ac0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
2ad0: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
2ae0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
2af0: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 20 4f 72 20  e.** iCur.   Or 
2b00: 69 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20  if pIdx!=0 then 
2b10: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
2b20: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
2b30: 78 2e 20 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74  x.  pIdx.** must
2b40: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
2b50: 6e 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20  ndexes of table 
2b60: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2b70: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
2b80: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
2b90: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
2ba0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
2bb0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
2bc0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
2bd0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
2be0: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
2bf0: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
2c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2c10: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
2c20: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2c30: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
2c40: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
2c50: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
2c60: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
2c70: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
2c80: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
2c90: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
2ca0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
2cb0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
2cc0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
2cd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2ce0: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
2cf0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2d00: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
2d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
2d20: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
2d30: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
2d40: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
2d50: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
2d60: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
2d70: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
2d80: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2da0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2db0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
2dc0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2dd0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2de0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2df0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e10: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
2e20: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e40: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
2e50: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
2e60: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2e70: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2e80: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2e90: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
2ea0: 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43    pScan->pOrigWC
2eb0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2ec0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  >pWC = pWC;.  pS
2ed0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20  can->pIdxExpr = 
2ee0: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  0;.  pScan->idxa
2ef0: 66 66 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d  ff = 0;.  pScan-
2f00: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a  >zCollName = 0;.
2f10: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2f20: 20 20 69 6e 74 20 6a 20 3d 20 69 43 6f 6c 75 6d    int j = iColum
2f30: 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  n;.    iColumn =
2f40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2f50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  j];.    if( iCol
2f60: 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  umn==XN_EXPR ){.
2f70: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64        pScan->pId
2f80: 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43  xExpr = pIdx->aC
2f90: 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
2fa0: 70 72 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d  pr;.      pScan-
2fb0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
2fc0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
2fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
2fe0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
2ff0: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
3000: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52    iColumn = XN_R
3010: 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  OWID;.    }else 
3020: 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
3030: 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 69  {.      pScan->i
3040: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3050: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3060: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3070: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
3080: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
3090: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  oll[j];.    }.  
30a0: 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d  }else if( iColum
30b0: 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  n==XN_EXPR ){.  
30c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
30d0: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
30e0: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
30f0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
3100: 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69 43  n->aiCur[0] = iC
3110: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43  ur;.  pScan->aiC
3120: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75  olumn[0] = iColu
3130: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
3140: 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e  uiv = 1;.  pScan
3150: 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20 20  ->iEquiv = 1;.  
3160: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
3170: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
3180: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
3190: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
31b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
31c0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
31d0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
31e0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31f0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
3200: 65 20 69 43 75 72 20 6f 72 20 6f 66 20 69 6e 64  e iCur or of ind
3210: 65 78 20 70 49 64 78 0a 2a 2a 20 69 66 20 70 49  ex pIdx.** if pI
3220: 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69  dx!=0 and <op> i
3230: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f  s one of the WO_
3240: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3250: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 2a  s specified by.*
3260: 2a 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  * the op paramet
3270: 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  er.  Return a po
3280: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
3290: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
32a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
32b0: 20 49 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e   If pIdx!=0 then
32c0: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   it must be one 
32d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f  of the indexes o
32e0: 66 20 74 61 62 6c 65 20 69 43 75 72 2e 20 20 0a  f table iCur.  .
32f0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 65  ** Search for te
3300: 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74 68 65  rms matching the
3310: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
3320: 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61  mn of pIdx.** ra
3330: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 43  ther than the iC
3340: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3350: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a  of table iCur..*
3360: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
3370: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
3380: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
3390: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
33a0: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
33b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
33c0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
33d0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
33e0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
33f0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
3400: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
3410: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
3420: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3430: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
3440: 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b  iCur[]/iaColumn[
3450: 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20 58 20  ] arrays hold X 
3460: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
3470: 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65 20 61  valents. There a
3480: 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69  re 11.** slots i
3490: 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75  n aiCur[]/aiColu
34a0: 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d 65 61  mn[] so that mea
34b0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
34c0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
34d0: 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71 75 69  10.** other equi
34e0: 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 20 20  valent values.  
34f0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
3500: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
3510: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 0a   <expr> if X=A1.
3520: 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  ** and A1=A2 and
3530: 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61   A2=A3 and ... a
3540: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
3550: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
3560: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
3570: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
3580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3590: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
35a0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
35b0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
35c0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
35d0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
35e0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
35f0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
3600: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
3610: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
3620: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
3630: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
3640: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
3650: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
3660: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
3670: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
3680: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
3690: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
36a0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
36b0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
36c0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
36d0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
36e0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
36f0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
3700: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
3710: 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  IV..*/.WhereTerm
3720: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46 69   *sqlite3WhereFi
3730: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3740: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3750: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3760: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3770: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3790: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37a0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37b0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
37c0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
37d0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
37e0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
37f0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3800: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3810: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3820: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
3830: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3840: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3850: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
3860: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
3870: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
3880: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
3890: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38a0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38b0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
38c0: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
38d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
38e0: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
38f0: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
3900: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
3910: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
3920: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f  , op, pIdx);.  o
3930: 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  p &= WO_EQ|WO_IS
3940: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
3950: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
3960: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3970: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
3980: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
3990: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
39a0: 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b  erator&op)!=0 ){
39b0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
39c0: 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20  e( p->eOperator 
39d0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
39e0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
39f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3a00: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
3a10: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
3a20: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
3a30: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
3a40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
3a50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
3a60: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
3a70: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20  es pList for an 
3a80: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
3a90: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
3aa0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
3ab0: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
3ac0: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
3ad0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
3ae0: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
3af0: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
3b00: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
3b10: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
3b20: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
3b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3b40: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
3b50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3b80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3b90: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
3ba0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3bb0: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
3bc0: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
3bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3be0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3bf0: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
3c00: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
3c10: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c30: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3c40: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
3c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3c80: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
3c90: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
3ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3cb0: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
3cc0: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
3cd0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
3ce0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
3cf0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3d00: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3d10: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
3d20: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3d30: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
3d40: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
3d50: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
3d60: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
3d70: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
3d80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
3d90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
3da0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
3db0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3dc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3dd0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
3de0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3df0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
3e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3e10: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
3e20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3e30: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
3e40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
3e50: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
3e60: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69   of index pIdx i
3e70: 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  s NOT NULL.*/.st
3e80: 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f  atic int indexCo
3e90: 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  lumnNotNull(Inde
3ea0: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
3eb0: 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  l){.  int j;.  a
3ec0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
3ed0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
3ee0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78  >=0 && iCol<pIdx
3ef0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a  ->nColumn );.  j
3f00: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
3f10: 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a  n[iCol];.  if( j
3f20: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
3f30: 6e 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  n pIdx->pTable->
3f40: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[j].notNull;
3f50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d  .  }else if( j==
3f60: 28 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (-1) ){.    retu
3f70: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
3f80: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d     assert( j==(-
3f90: 32 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  2) );.    return
3fa0: 20 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61   0;  /* Assume a
3fb0: 6e 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  n indexed expres
3fc0: 73 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20  sion can always 
3fd0: 79 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a  yield a NULL */.
3fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3ff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
4000: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
4010: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
4020: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
4030: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
4040: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
4050: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
4060: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e   redundant if an
4070: 79 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  y subset of the 
4080: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a  columns in the.*
4090: 2a 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  * DISTINCT list 
40a0: 61 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79  are collectively
40b0: 20 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69   unique and indi
40c0: 76 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c  vidually non-nul
40d0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
40e0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
40f0: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
4100: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4110: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
4120: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
4130: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
4140: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
4150: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4160: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
4180: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
4190: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
41a0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
41b0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
41c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
41d0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
41e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
41f0: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
4200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4210: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
4220: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
4230: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
4240: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
4250: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
4260: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4270: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
4280: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
4290: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
42a0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
42b0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
42c0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
42d0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
42e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
42f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4300: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
4310: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
4320: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
4330: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
4340: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
4350: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
4360: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
4370: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
4380: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
4390: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
43a0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
43b0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
43c0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
43d0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
43e0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
43f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
4400: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
4410: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
4420: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
4430: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
4440: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
4450: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
4460: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
4470: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
4480: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
4490: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
44a0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
44b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
44c0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
44d0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
44e0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
44f0: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
4500: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4520: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
4530: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
4540: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
4550: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
4560: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
4570: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
4580: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
4590: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
45a0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
45b0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
45c0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
45d0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
45e0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
45f0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
4600: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
4610: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
4620: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
4630: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
4640: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
4650: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
4660: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
4670: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
4680: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
4690: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
46a0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
46b0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
46c0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
46d0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
46e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
46f0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
4700: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
4710: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
4720: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
4730: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
4740: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4750: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4760: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4770: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
4780: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
4790: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
47a0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
47b0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
47c0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
47d0: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
47e0: 43 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42  C, iBase, i, ~(B
47f0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
4800: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
4810: 20 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43    if( findIndexC
4820: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
4830: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
4840: 78 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b  x, i)<0 ) break;
4850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64  .        if( ind
4860: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
4870: 70 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72  pIdx, i)==0 ) br
4880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4890: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
48a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
48b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
48c0: 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
48d0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
48e0: 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
48f0: 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
4900: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4910: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
4920: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  .../*.** Estimat
4930: 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
4940: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
4950: 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
4960: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65  .static LogEst e
4970: 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b  stLog(LogEst N){
4980: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20  .  return N<=10 
4990: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67  ? 0 : sqlite3Log
49a0: 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a  Est(N) - 33;.}..
49b0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50  /*.** Convert OP
49c0: 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20  _Column opcodes 
49d0: 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72  to OP_Copy in pr
49e0: 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
49f0: 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed code..**.** T
4a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
4a10: 20 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20   over generated 
4a20: 56 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72  VDBE code and tr
4a30: 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75  anslates OP_Colu
4a40: 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e  mn.** opcodes in
4a50: 74 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20  to OP_Copy when 
4a60: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
4a70: 6e 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20  ng accessed via 
4a80: 63 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69  co-routine .** i
4a90: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61  nstead of via ta
4aa0: 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a  ble lookup..**.*
4ab0: 2a 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f  * If the bIncrRo
4ac0: 77 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  wid parameter is
4ad0: 20 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f   0, then any OP_
4ae0: 52 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f  Rowid instructio
4af0: 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20  ns on.** cursor 
4b00: 69 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e  iTabCur are tran
4b10: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f  sformed into OP_
4b20: 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e  Null. Or, if bIn
4b30: 63 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  crRowid is non-z
4b40: 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63  ero,.** then eac
4b50: 68 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72  h OP_Rowid is tr
4b60: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61  ansformed into a
4b70: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
4b80: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a   increment the.*
4b90: 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  * value stored i
4ba0: 6e 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67  n its output reg
4bb0: 69 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ister..*/.static
4bc0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43   void translateC
4bd0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50  olumnToCopy(.  P
4be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4bf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4c00: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
4c10: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4c20: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4c30: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4c40: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4c50: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4c60: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4c70: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4c80: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4ca0: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4cb0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
4cc0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
4cd0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
4ce0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
4cf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
4d00: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
4d10: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4d20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4d30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4d40: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71  VdbeOp *pOp = sq
4d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
4d60: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74  , iStart);.  int
4d70: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
4d80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4d90: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
4da0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4db0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  d ) return;.  fo
4dc0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
4dd0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
4de0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
4df0: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4e00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4e10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4e20: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4e30: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4e40: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4e50: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4e60: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4e70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4e80: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4e90: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
4ea0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
4eb0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
4ec0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
4ed0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
4ee0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
4ef0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4f00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4f10: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4f20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4f30: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4f40: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4f50: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4f60: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4f70: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4f80: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4f90: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
4fa0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
4fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
4fc0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
4fd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4fe0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
4ff0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
5000: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
5010: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5020: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
5030: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
5040: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
5050: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
5060: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
5070: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
5080: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
5090: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
50a0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
50b0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
50c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
50d0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
50e0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
50f0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
5100: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
5110: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
5120: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5140: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5150: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5170: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5180: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5190: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
51a0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
51b0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
51c0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
51d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
51e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
51f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5200: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
5210: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
5220: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
5230: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
5240: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5250: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
5260: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
5270: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
5280: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5290: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
52a0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
52b0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
52c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
52d0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
52e0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
52f0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
5300: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
5310: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
5320: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
5330: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5340: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5350: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5360: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5370: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5380: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5390: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
53a0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
53b0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
53c0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
53d0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
53e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
53f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
5400: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5410: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
5420: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
5430: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
5440: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
5450: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
5460: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5470: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
5480: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
5490: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
54a0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
54b0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
54c0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
54d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
54e0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
54f0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
5500: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
5510: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5520: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5530: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
5540: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
5550: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
5560: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
5570: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
5580: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
5590: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
55a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55b0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
55d0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
55e0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
55f0: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
5600: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
5610: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
5620: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
5630: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
5640: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
5650: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
5660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
5670: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
5680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5690: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
56a0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
56b0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
56c0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
56d0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
56e0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
56f0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
5700: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
5710: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5730: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
5740: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
5750: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5760: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5770: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
5780: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
5790: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
57a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
57b0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
57c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
57d0: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
57e0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20  pe & JT_LEFT) . 
57f0: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5800: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
5810: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5820: 0a 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  .   && (pTerm->e
5830: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
5840: 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ).  ){.    /* Ca
5850: 6e 6e 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74  nnot use an IS t
5860: 65 72 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45  erm from the WHE
5870: 52 45 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20  RE clause as an 
5880: 69 6e 64 65 78 20 64 72 69 76 65 72 20 66 6f 72  index driver for
5890: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
58a0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
58b0: 53 75 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20  Such a term can 
58c0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
58d0: 69 74 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a  it is from.    *
58e0: 2a 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  * the ON clause.
58f0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
5900: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54  0;.  }.  if( (pT
5910: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5920: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
5930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5940: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
5950: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
5960: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
5970: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
5980: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5990: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
59a0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
59b0: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
59c0: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
59d0: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
59e0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
59f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
5a00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5a10: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
5a20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
5a30: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
5a40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5a50: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
5a60: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
5a70: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
5a80: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
5a90: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
5aa0: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
5ab0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
5ac0: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
5ad0: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
5ae0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b00: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
5b10: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
5b20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5b40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b50: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
5b60: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
5b70: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5b80: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
5b90: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
5ba0: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
5bb0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5bc0: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
5bd0: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
5be0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
5bf0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
5c00: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5c10: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
5c20: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
5c30: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
5c40: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
5c50: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
5c60: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
5c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5c80: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5c90: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
5ca0: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
5cb0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
5cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5cd0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
5ce0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5cf0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
5d00: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
5d10: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
5d20: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
5d30: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5d40: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
5d50: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
5d60: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
5d70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d90: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
5da0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
5db0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5dc0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5de0: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
5df0: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
5e00: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
5e10: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
5e40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
5e50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5e60: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5e70: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
5e80: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
5e90: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
5ea0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5eb0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
5ec0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5ef0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5f00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5f20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5f30: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
5f50: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
5f60: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
5f70: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5f90: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
5fa0: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
5fb0: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
5fc0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
5fd0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
5fe0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
5ff0: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
6000: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
6010: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
6020: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
6030: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
6040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6050: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
6060: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
6070: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
6080: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
6090: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
60a0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
60b0: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
60c0: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
60d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
60e0: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
60f0: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
6100: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
6110: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
6120: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
6130: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
6140: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
6150: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6160: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
6170: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  luded rows */.  
6180: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
6190: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
61a0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
61b0: 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65  erm being indexe
61c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  d */.  int addrC
61d0: 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20  ounter = 0;     
61e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68     /* Address wh
61f0: 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e  ere integer coun
6200: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
6210: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  ed */.  int regB
6220: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
6230: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6240: 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20  registers where 
6250: 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62  record is assemb
6260: 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  led */..  /* Gen
6270: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
6280: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
6290: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
62a0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
62b0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
62c0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
62d0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
62e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
62f0: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
6300: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6310: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
6320: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
6330: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6340: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
6350: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
6360: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6370: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
6380: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
6390: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
63a0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
63b0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
63c0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
63d0: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
63e0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
63f0: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
6400: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
6410: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
6420: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
6430: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
6440: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
6450: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
6460: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
6470: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
6480: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
6490: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
64a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
64b0: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
64c0: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
64d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
64e0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
64f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
6500: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
6510: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
6520: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
6530: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
6540: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6560: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
6570: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
6580: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
6590: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
65a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
65b0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
65c0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
65d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
65e0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
65f0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
6600: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
6610: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
6620: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
6630: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
6640: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6650: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6680: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
6690: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
66a0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
66b0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
66c0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
66d0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
66e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
66f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6700: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6710: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6720: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6730: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6740: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6750: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6760: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
6770: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6780: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
6790: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
67a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
67b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
67c0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
67d0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
67e0: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
67f0: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6800: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6810: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
6820: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
6830: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
6840: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6850: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
6860: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
6870: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6880: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
6890: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
68a0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
68b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
68c0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
68d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68e0: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
68f0: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6900: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6910: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6930: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6940: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6950: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6960: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6970: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6980: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
6990: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
69a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
69b0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
69e0: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
69f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6a00: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6a10: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6a20: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6a30: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6a40: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6a50: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6a60: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6a70: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6a80: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6a90: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6aa0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6ab0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6ac0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6ad0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6ae0: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6af0: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6b00: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6b10: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6b20: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6b30: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6b40: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6b50: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6b60: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6b70: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6b80: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6b90: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6ba0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6bb0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6bc0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6bd0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6be0: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6bf0: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6c00: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6c10: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6c20: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6c30: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6c40: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6c50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6c60: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6c70: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6c80: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6c90: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6ca0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6cb0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6cc0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6cd0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6ce0: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6cf0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6d00: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6d10: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6d20: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6d30: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6d40: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6d50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6d60: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6d70: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6d80: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6d90: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6da0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6db0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6dc0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6dd0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6de0: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6df0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6e00: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6e10: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6e20: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6e30: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6e40: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6e50: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6e60: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6e70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
6e80: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6e90: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
6ea0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
6eb0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
6ec0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
6ed0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
6ee0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6ef0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
6f00: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6f10: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
6f20: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
6f30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f40: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
6f50: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6f60: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6f70: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
6f80: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
6f90: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6fa0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
6fb0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
6fc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
6fd0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6fe0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
6ff0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
7000: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
7010: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7020: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7030: 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  Y;.        n++;.
7040: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7050: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
7060: 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
7070: 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
7080: 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
7090: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
70a0: 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
70b0: 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
70c0: 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
70d0: 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
70e0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
70f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
7100: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
7110: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
7120: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
7130: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
7140: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69  azColl[n] = sqli
7150: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
7160: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
7170: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
7180: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
7190: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
71a0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
71b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
71c0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
71d0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
71e0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
71f0: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
7200: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e  rBINARY;.      n
7210: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
7220: 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43  assert( n==nKeyC
7230: 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  ol );.  pIdx->ai
7240: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52  Column[n] = XN_R
7250: 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  OWID;.  pIdx->az
7260: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7270: 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f  3StrBINARY;..  /
7280: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
7290: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
72a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
72b0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
72c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
72d0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
72e0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
72f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7300: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
7310: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
7320: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
7330: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
7340: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
7350: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
7360: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
7370: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
7380: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
7390: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
73a0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
73b0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
73c0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
73d0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
73e0: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
73f0: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
7400: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
7410: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
7430: 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72  .    addrCounter
7440: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7450: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7460: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
7470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7480: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
7490: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
74a0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
74b0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
74c0: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
74e0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
74f0: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
7500: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7510: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7520: 78 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70  xt row of %s", p
7530: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
7540: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
7550: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
7560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7570: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
7580: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
7590: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
75a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
75b0: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
75c0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
75d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
75e0: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
75f0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
7600: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
7610: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
7620: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
7630: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
7640: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
7650: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
7660: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
7670: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
7680: 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73  );.  regBase = s
7690: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
76a0: 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50  dexKey(.      pP
76b0: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
76c0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
76d0: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
76e0: 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65   0.  );.  sqlite
76f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7700: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
7710: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
7720: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
7730: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7740: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
7750: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
7760: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
7770: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
7780: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
7790: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
77a0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
77b0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
77c0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
77d0: 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67  addrCounter, reg
77e0: 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73  Base+n);.    tes
77f0: 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
7800: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7810: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7820: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7830: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7840: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
7870: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29  m->regResult, 1)
7880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7890: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
78a0: 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d  );.    pTabItem-
78b0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
78c0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
78d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
78e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
78f0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7900: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
7910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7920: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
7930: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
7940: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
7950: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
7960: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7970: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
7980: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7990: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
79a0: 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a  Record);.  .  /*
79b0: 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
79c0: 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
79d0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
79e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
79f0: 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
7a00: 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64  );..end_auto_ind
7a10: 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c  ex_create:.  sql
7a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7a30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74  Parse->db, pPart
7a40: 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ial);.}.#endif /
7a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
7a60: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
7a70: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7a80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7a90: 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
7aa0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
7ab0: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
7ac0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
7ad0: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
7ae0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
7af0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
7b00: 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
7b10: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
7b20: 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
7b30: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
7b40: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
7b50: 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
7b60: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
7b70: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7b80: 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
7b90: 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
7ba0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
7bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7bc0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
7bd0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7be0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
7bf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
7c00: 45 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  E clause being a
7c10: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
7c20: 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20  mask mUnusable, 
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c40: 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74  Ignore terms wit
7c50: 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20  h these prereqs 
7c60: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7c70: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
7c80: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
7c90: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
7ca0: 74 20 69 73 20 74 68 65 20 76 74 61 62 20 2a 2f  t is the vtab */
7cb0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
7cc0: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20  derBy,          
7cd0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
7ce0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
7cf0: 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20  16 *pmNoOmit    
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d10: 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20  * Mask of terms 
7d20: 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29  not to omit */.)
7d30: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
7d40: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
7d50: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7d60: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
7d70: 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
7d80: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
7d90: 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
7da0: 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
7db0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7dc0: 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
7dd0: 73 61 67 65 3b 0a 20 20 73 74 72 75 63 74 20 48  sage;.  struct H
7de0: 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a  iddenIndexInfo *
7df0: 70 48 69 64 64 65 6e 3b 0a 20 20 57 68 65 72 65  pHidden;.  Where
7e00: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
7e10: 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
7e20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7e30: 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 75  o *pIdxInfo;.  u
7e40: 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a  16 mNoOmit = 0;.
7e50: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
7e60: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
7e70: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
7e80: 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
7e90: 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
7ea0: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
7eb0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
7ec0: 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
7ed0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
7ee0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7ef0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
7f00: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
7f10: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
7f20: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7f30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
7f40: 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20  t & mUnusable ) 
7f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
7f60: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
7f70: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
7f80: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
7f90: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7fa0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7fb0: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
7fc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7fd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7fe0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7ff0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8000: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8010: 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IS );.    testca
8020: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
8030: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b  ator & WO_ALL );
8040: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
8050: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57  >eOperator & ~(W
8060: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
8070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
8080: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
8090: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
80a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
80b0: 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ert( pTerm->u.le
80c0: 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29  ftColumn>=(-1) )
80d0: 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
80e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
80f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8100: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
8110: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
8120: 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
8130: 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
8140: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
8150: 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
8160: 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
8170: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8180: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
8190: 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
81a0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
81b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
81c0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
81d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
81e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  n; i++){.      E
81f0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
8200: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8210: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
8220: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
8230: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
8240: 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
8250: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
8260: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a  .    if( i==n){.
8270: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
8280: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   n;.    }.  }.. 
8290: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
82a0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
82b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
82c0: 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
82d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
82e0: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
82f0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
8300: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
8320: 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
8330: 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
8340: 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
8370: 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
8380: 64 65 72 42 79 20 2b 20 73 69 7a 65 6f 66 28 2a  derBy + sizeof(*
8390: 70 48 69 64 64 65 6e 29 20 29 3b 0a 20 20 69 66  pHidden) );.  if
83a0: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
83b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
83c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
83d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
83e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
83f0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8400: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
8410: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
8420: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
8430: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
8440: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
8450: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
8460: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
8470: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
8480: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
8490: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
84a0: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
84b0: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
84c0: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
84d0: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
84e0: 2e 0a 20 20 2a 2f 0a 20 20 70 48 69 64 64 65 6e  ..  */.  pHidden
84f0: 20 3d 20 28 73 74 72 75 63 74 20 48 69 64 64 65   = (struct Hidde
8500: 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64  nIndexInfo*)&pId
8510: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
8520: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
8530: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8540: 73 74 72 61 69 6e 74 2a 29 26 70 48 69 64 64 65  straint*)&pHidde
8550: 6e 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  n[1];.  pIdxOrde
8560: 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
8570: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
8580: 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
8590: 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
85a0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
85b0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
85c0: 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
85d0: 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
85e0: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
85f0: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
8600: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
8610: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
8620: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
8630: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
8640: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8650: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
8660: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8670: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
8680: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
8690: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
86a0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
86b0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
86c0: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
86d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
86e0: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
86f0: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
8700: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 70 55 73 61 67 65 3b 0a 0a 20 20 70 48 69 64 64  pUsage;..  pHidd
8760: 65 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  en->pWC = pWC;. 
8770: 20 70 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65   pHidden->pParse
8780: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
8790: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
87a0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
87b0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
87c0: 29 7b 0a 20 20 20 20 75 31 36 20 6f 70 3b 0a 20  ){.    u16 op;. 
87d0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
87e0: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
87f0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
8800: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8810: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
8820: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
8830: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
8840: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
8850: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
8860: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
8870: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8880: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8890: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
88a0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
88b0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
88c0: 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IS );.    testc
88d0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
88e0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
88f0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
8900: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8910: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
8920: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8930: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
8940: 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
8950: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8960: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
8970: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
8980: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8990: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
89a0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
89b0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
89c0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
89d0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
89e0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 70 54  oin).     && (pT
89f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8a00: 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c   (WO_IS|WO_ISNUL
8a10: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
8a20: 20 2f 2a 20 41 6e 20 22 49 53 22 20 74 65 72 6d   /* An "IS" term
8a30: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
8a40: 61 75 73 65 20 77 68 65 72 65 20 74 68 65 20 76  ause where the v
8a50: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
8a60: 74 68 65 20 72 68 73 0a 20 20 20 20 20 20 2a 2a  the rhs.      **
8a70: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
8a80: 20 44 6f 20 6e 6f 74 20 70 61 73 73 20 74 68 69   Do not pass thi
8a90: 73 20 74 65 72 6d 20 74 6f 20 74 68 65 20 76 69  s term to the vi
8aa0: 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
8ab0: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
8ac0: 69 6f 6e 2c 20 61 73 20 74 68 69 73 20 63 61 6e  ion, as this can
8ad0: 20 6c 65 61 64 20 74 6f 20 69 6e 63 6f 72 72 65   lead to incorre
8ae0: 63 74 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ct results from 
8af0: 53 51 4c 20 73 75 63 68 0a 20 20 20 20 20 20 2a  SQL such.      *
8b00: 2a 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  * as:.      **. 
8b10: 20 20 20 20 20 2a 2a 20 20 20 22 4c 45 46 54 20       **   "LEFT 
8b20: 4a 4f 49 4e 20 76 74 61 62 20 57 48 45 52 45 20  JOIN vtab WHERE 
8b30: 76 74 61 62 2e 63 6f 6c 20 49 53 20 4e 55 4c 4c  vtab.col IS NULL
8b40: 22 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  "  */.      test
8b50: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8b60: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
8b70: 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
8b80: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8b90: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
8ba0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
8bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
8bc0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
8bd0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
8be0: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
8bf0: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
8c00: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
8c10: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8c20: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
8c30: 0a 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d  .    op = pTerm-
8c40: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8c50: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
8c60: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
8c70: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  _EQ;.    if( op=
8c80: 3d 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20 20 20  =WO_AUX ){.     
8c90: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
8ca0: 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f  = pTerm->eMatchO
8cb0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
8cc0: 20 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c   op & (WO_ISNULL
8cd0: 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
8ce0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55   if( op==WO_ISNU
8cf0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  LL ){.        pI
8d00: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53  dxCons[j].op = S
8d10: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8d20: 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20  TRAINT_ISNULL;. 
8d30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8d40: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8d50: 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  op = SQLITE_INDE
8d60: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b  X_CONSTRAINT_IS;
8d70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
8d80: 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f  se{.      pIdxCo
8d90: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f  ns[j].op = (u8)o
8da0: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;.      /* The 
8db0: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
8dc0: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
8dd0: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
8de0: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
8df0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f        ** the WO_
8e00: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
8e10: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
8e20: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
8e30: 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
8e40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
8e50: 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
8e60: 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  act. */.      as
8e70: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
8e80: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8e90: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20  AINT_EQ );.     
8ea0: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
8eb0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8ec0: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
8ed0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
8ee0: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
8ef0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
8f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
8f10: 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
8f20: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
8f30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8f40: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
8f50: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8f60: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _GE );.      ass
8f70: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
8f80: 72 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57 4f 5f  rator&(WO_IN|WO_
8f90: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
8fa0: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 41 55  O_GT|WO_GE|WO_AU
8fb0: 58 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  X) );..      if(
8fc0: 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f   op & (WO_LT|WO_
8fd0: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a  LE|WO_GT|WO_GE).
8fe0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
8ff0: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 54  3ExprIsVector(pT
9000: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
9010: 68 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ht) .      ){.  
9020: 20 20 20 20 20 20 69 66 28 20 69 3c 31 36 20 29        if( i<16 )
9030: 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c   mNoOmit |= (1 <
9040: 3c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  < i);.        if
9050: 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49  ( op==WO_LT ) pI
9060: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57  dxCons[j].op = W
9070: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66  O_LE;.        if
9080: 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49  ( op==WO_GT ) pI
9090: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57  dxCons[j].op = W
90a0: 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  O_GE;.      }.  
90b0: 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20    }..    j++;.  
90c0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
90d0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
90e0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
90f0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
9100: 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
9110: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
9120: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
9130: 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
9140: 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
9150: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
9160: 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a  tOrder;.  }..  *
9170: 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d  pmNoOmit = mNoOm
9180: 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64  it;.  return pId
9190: 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
91a0: 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
91b0: 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
91c0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
91d0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
91e0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
91f0: 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
9200: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
9210: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
9220: 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
9230: 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
9240: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
9250: 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
9260: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f  te3_index_info o
9270: 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
9280: 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72  mes in as the 3r
9290: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
92a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
92b0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
92c0: 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
92d0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
92e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
92f0: 20 61 6e 64 20 61 6e 0a 2a 2a 20 61 70 70 72 6f   and an.** appro
9300: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
9310: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
9320: 41 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  A return of SQLI
9330: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 72  TE_CONSTRAINT fr
9340: 6f 6d 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  om.** xBestIndex
9350: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
9360: 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 20 53 51  ed an error.  SQ
9370: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
9380: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
9390: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  * the current co
93a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 22  nfiguration of "
93b0: 75 6e 75 73 61 62 6c 65 22 20 66 6c 61 67 73 20  unusable" flags 
93c0: 69 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  in sqlite3_index
93d0: 5f 69 6e 66 6f 20 63 61 6e 0a 2a 2a 20 6e 6f 74  _info can.** not
93e0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 76 61 6c   result in a val
93f0: 69 64 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 57  id plan..**.** W
9400: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
9410: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
9420: 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
9430: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
9440: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
9450: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
9460: 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
9470: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
9480: 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
9490: 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
94a0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
94b0: 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
94c0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
94d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
94e0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
94f0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
9500: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
9510: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
9520: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
9530: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  ->pVtab;.  int r
9540: 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
9550: 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
9560: 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
9570: 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
9580: 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
9590: 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
95a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
95b0: 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
95c0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
95d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
95e0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
95f0: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
9600: 6c 74 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  lt(pParse->db);.
9610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
9620: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
9630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9640: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9650: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
9660: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
9670: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9680: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9690: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
96a0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
96b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
96c0: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
96d0: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
96e0: 4d 73 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Msg = 0;.  retur
96f0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
9700: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
9710: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9720: 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  BLE) */..#ifdef 
9730: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9740: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
9750: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
9760: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61  location of a pa
9770: 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f  rticular key amo
9780: 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61  ng all keys in a
9790: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f  n.** index.  Sto
97a0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
97b0: 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f  n aStat as follo
97c0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74  ws:.**.**    aSt
97d0: 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20  at[0]      Est. 
97e0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c  number of rows l
97f0: 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a  ess than pRec.**
9800: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20      aStat[1]    
9810: 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
9820: 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70   rows equal to p
9830: 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  Rec.**.** Return
9840: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
9850: 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  e sample that is
9860: 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61   the smallest sa
9870: 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  mple that.** is 
9880: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9890: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e  equal to pRec. N
98a0: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e  ote that this in
98b0: 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  dex is not an in
98c0: 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  dex.** into the 
98d0: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20  aSample[] array 
98e0: 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78  - it is an index
98f0: 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20   into a virtual 
9900: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a  set of samples.*
9910: 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  * based on the c
9920: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70  ontents of aSamp
9930: 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d  le[] and the num
9940: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9950: 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63   record .** pRec
9960: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
9970: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a   whereKeyStats(.
9980: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99a0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
99b0: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
99c0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
99d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
99e0: 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69  o consider domai
99f0: 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  n of */.  Unpack
9a00: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20  edRecord *pRec, 
9a10: 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
9a20: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e  of values to con
9a30: 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  sider */.  int r
9a40: 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20  oundUp,         
9a50: 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20         /* Round 
9a60: 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75  up if true.  Rou
9a70: 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65  nd down if false
9a80: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
9a90: 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20  Stat            
9aa0: 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20    /* OUT: stats 
9ab0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
9ac0: 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  ){.  IndexSample
9ad0: 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78   *aSample = pIdx
9ae0: 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74  ->aSample;.  int
9af0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
9b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9b10: 78 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74  x of required st
9b20: 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74  ats in anEq[] et
9b30: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  c. */.  int i;  
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9b60: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20  first sample >= 
9b70: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53  pRec */.  int iS
9b80: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ample;          
9b90: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
9ba0: 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20  t sample larger 
9bb0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9bc0: 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pRec */.  int i
9bd0: 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Min = 0;        
9be0: 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
9bf0: 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65  st sample not ye
9c00: 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  t tested */.  in
9c10: 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20  t iTest;        
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
9c30: 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74  t sample to test
9c40: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63    /* Result of c
9c70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
9c80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ion */.  int nFi
9c90: 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
9ca0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9cb0: 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63  f fields in pRec
9cc0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c   */.  tRowcnt iL
9cd0: 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ower = 0;       
9ce0: 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e    /* anLt[] + an
9cf0: 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20  Eq[] of largest 
9d00: 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e  sample pRec is >
9d10: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
9d20: 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53  ITE_DEBUG.  UNUS
9d30: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50  ED_PARAMETER( pP
9d40: 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20  arse );.#endif. 
9d50: 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30   assert( pRec!=0
9d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
9d70: 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d  .  assert( pRec-
9d90: 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65  >nField>0 && pRe
9da0: 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d  c->nField<=pIdx-
9db0: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a  >nSampleCol );..
9dc0: 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79    /* Do a binary
9dd0: 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20   search to find 
9de0: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
9df0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
9e00: 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70   equal.  ** to p
9e10: 52 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e  Rec. If pRec con
9e20: 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66  tains a single f
9e30: 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66  ield, the set of
9e40: 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72   samples to sear
9e50: 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c  ch.  ** is simpl
9e60: 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  y the aSample[] 
9e70: 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61  array. If the sa
9e80: 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
9e90: 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a  [] contain more.
9ea0: 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69    ** than one fi
9eb0: 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73  elds, all fields
9ec0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66   following the f
9ed0: 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64  irst are ignored
9ee0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
9ef0: 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66  Rec contains N f
9f00: 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69  ields, where N i
9f10: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c  s more than one,
9f20: 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73   then as well as
9f30: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   the.  ** sample
9f40: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28  s in aSample[] (
9f50: 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66  truncated to N f
9f60: 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72  ields), the sear
9f70: 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20  ch also has to. 
9f80: 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65   ** consider pre
9f90: 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73  fixes of those s
9fa0: 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d  amples. For exam
9fb0: 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20  ple, if the set 
9fc0: 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20  of samples.  ** 
9fd0: 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20  in aSample is:. 
9fe0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61   **.  **     aSa
9ff0: 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29  mple[0] = (a, 5)
a000: 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70   .  **     aSamp
a010: 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20  le[1] = (a, 10) 
a020: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a030: 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20  e[2] = (b, 5) . 
a040: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a050: 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20  3] = (c, 100) . 
a060: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a070: 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20  4] = (c, 105).  
a080: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
a090: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68   search space sh
a0a0: 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20  ould ideally be 
a0b0: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76  the samples abov
a0c0: 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  e and the .  ** 
a0d0: 75 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20  unique prefixes 
a0e0: 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d  [a], [b] and [c]
a0f0: 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74  . But since that
a100: 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61   is hard to orga
a110: 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20  nize, .  ** the 
a120: 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65  code actually se
a130: 61 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a  arches this set:
a140: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30  .  **.  **     0
a150: 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (a) .  **     
a160: 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20  1: (a, 5) .  ** 
a170: 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a      2: (a, 10) .
a180: 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20    **     3: (a, 
a190: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a  10) .  **     4:
a1a0: 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35   (b) .  **     5
a1b0: 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (b, 5) .  **  
a1c0: 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20     6: (c) .  ** 
a1d0: 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20      7: (c, 100) 
a1e0: 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c  .  **     8: (c,
a1f0: 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39   105).  **     9
a200: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a  : (c, 105).  **.
a210: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61    ** For each sa
a220: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d  mple in the aSam
a230: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73  ple[] array, N s
a240: 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65  amples are prese
a250: 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65  nt in the.  ** e
a260: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20  ffective sample 
a270: 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62  array. In the ab
a280: 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61  ove, samples 0 a
a290: 6e 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f  nd 1 are based o
a2a0: 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61  n .  ** sample a
a2b0: 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c  Sample[0]. Sampl
a2c0: 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53  es 2 and 3 on aS
a2d0: 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20  ample[1] etc..  
a2e0: 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73  **.  ** Often, s
a2f0: 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20  ample i of each 
a300: 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63  block of N effec
a310: 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73  tive samples has
a320: 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20   (i+1) fields.. 
a330: 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68   ** Except, each
a340: 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65   sample may be e
a350: 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72  xtended to ensur
a360: 65 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65  e that it is gre
a370: 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a  ater than or.  *
a380: 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70  * equal to the p
a390: 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69  revious sample i
a3a0: 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72  n the array. For
a3b0: 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65   example, in the
a3c0: 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61   above, .  ** sa
a3d0: 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69  mple 2 is the fi
a3e0: 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20  rst sample of a 
a3f0: 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c  block of N sampl
a400: 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20  es, so at first 
a410: 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73  it .  ** appears
a420: 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
a430: 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69  be 1 field in si
a440: 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61  ze. However, tha
a450: 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20  t would make it 
a460: 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  .  ** smaller th
a470: 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20  an sample 1, so 
a480: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
a490: 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b  h would not work
a4a0: 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a  . As a result, .
a4b0: 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e    ** it is exten
a4c0: 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64  ded to two field
a4d0: 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65  s. The duplicate
a4e0: 73 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61  s that this crea
a4f0: 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a  tes do not .  **
a500: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
a510: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65  ems..  */.  nFie
a520: 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ld = pRec->nFiel
a530: 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20  d;.  iCol = 0;. 
a540: 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   iSample = pIdx-
a550: 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c  >nSample * nFiel
a560: 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74  d;.  do{.    int
a570: 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20   iSamp;         
a580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a590: 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  dex in aSample[]
a5a0: 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20   of test sample 
a5b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  */.    int n;   
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a5e0: 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74  f fields in test
a5f0: 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20   sample */..    
a600: 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53  iTest = (iMin+iS
a610: 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53  ample)/2;.    iS
a620: 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46  amp = iTest / nF
a630: 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53  ield;.    if( iS
a640: 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  amp>0 ){.      /
a650: 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65  * The proposed e
a660: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20  ffective sample 
a670: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73  is a prefix of s
a680: 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53  ample aSample[iS
a690: 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53  amp]..      ** S
a6a0: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
a6b0: 20 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78   shortest prefix
a6c0: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20   of at least (1 
a6d0: 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20  + iTest%nField) 
a6e0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  .      ** fields
a6f0: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a700: 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
a710: 75 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  us effective sam
a720: 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  ple.  */.      f
a730: 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46  or(n=(iTest % nF
a740: 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69  ield) + 1; n<nFi
a750: 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  eld; n++){.     
a760: 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
a770: 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31  Samp-1].anLt[n-1
a780: 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  ]!=aSample[iSamp
a790: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72  ].anLt[n-1] ) br
a7a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a7b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
a7c0: 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20  = iTest + 1;.   
a7d0: 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46   }..    pRec->nF
a7e0: 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65  ield = n;.    re
a7f0: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
a800: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
a810: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61  mple[iSamp].n, a
a820: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c  Sample[iSamp].p,
a830: 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20   pRec);.    if( 
a840: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
a850: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
a860: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a870: 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   + aSample[iSamp
a880: 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20  ].anEq[n-1];.   
a890: 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
a8a0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
a8b0: 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69   res==0 && n<nFi
a8c0: 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  eld ){.      iLo
a8d0: 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53  wer = aSample[iS
a8e0: 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a  amp].anLt[n-1];.
a8f0: 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65        iMin = iTe
a900: 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20  st+1;.      res 
a910: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
a920: 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d  .      iSample =
a930: 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43   iTest;.      iC
a940: 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a  ol = n-1;.    }.
a950: 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26    }while( res &&
a960: 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b   iMin<iSample );
a970: 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f  .  i = iSample /
a980: 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66   nField;..#ifdef
a990: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
a9a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
a9b0: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
a9c0: 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ts check that th
a9d0: 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
a9e0: 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20  code.  ** above 
a9f0: 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20  found the right 
aa00: 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f  answer. This blo
aa10: 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72  ck serves no pur
aa20: 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20  pose other.  ** 
aa30: 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  than to invoke t
aa40: 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a  he asserts.  */.
aa50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
aa60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
aa70: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  0 ){.    if( res
aa80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
aa90: 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
aaa0: 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  rue, then pRec m
aab0: 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20  ust be equal to 
aac0: 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20  sample i. */.   
aad0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
aae0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
aaf0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
ab00: 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20  ==nField-1 );.  
ab10: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
ab20: 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20   = nField;.     
ab30: 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
ab40: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
ab50: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
ab60: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
ab70: 20 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20   pRec) .        
ab80: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
ab90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a  ->mallocFailed .
aba0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
abb0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c  se{.      /* Unl
abc0: 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  ess i==pIdx->nSa
abd0: 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67  mple, indicating
abe0: 20 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61   that pRec is la
abf0: 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  rger than.      
ac00: 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69  ** all samples i
ac10: 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
ac20: 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74  array, pRec must
ac30: 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
ac40: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69   the.      ** (i
ac50: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
ac60: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e  fix of sample i.
ac70: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
ac80: 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i<=pIdx->nSam
ac90: 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20  ple && i>=0 );. 
aca0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
acb0: 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20  d = iCol+1;.    
acc0: 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64    assert( i==pId
acd0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  x->nSample .    
ace0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
acf0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
ad00: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
ad10: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
ad20: 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20  Rec)>0.         
ad30: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
ad40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ad50: 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d  ..      /* if i=
ad60: 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20  =0 and iCol==0, 
ad70: 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63  then record pRec
ad80: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
ad90: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20   all samples.   
ada0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61     ** in the aSa
adb0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74  mple[] array. Ot
adc0: 68 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f  herwise, if (iCo
add0: 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d  l>0) then pRec m
ade0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
adf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
ae00: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43  equal to the (iC
ae10: 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  ol) field prefix
ae20: 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20   of sample i..  
ae30: 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c      ** If (i>0),
ae40: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
ae50: 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20  also be greater 
ae60: 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31  than sample (i-1
ae70: 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ).  */.      if(
ae80: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
ae90: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
aea0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
aeb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
aec0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
aed0: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
aee0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
aef0: 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20  c)<=0.          
af00: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
af10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
af20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
af30: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
af40: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
af50: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
af60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
af70: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
af80: 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  re(aSample[i-1].
af90: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  n, aSample[i-1].
afa0: 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20  p, pRec)<0.     
afb0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
afc0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
afd0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
afe0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
aff0: 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
b000: 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20  DEBUG */..  if( 
b010: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  res==0 ){.    /*
b020: 20 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   Record pRec is 
b030: 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20  equal to sample 
b040: 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  i */.    assert(
b050: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
b060: 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  );.    aStat[0] 
b070: 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
b080: 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
b090: 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
b0a0: 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
b0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
b0c0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
b0d0: 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  e (iCol+1) field
b0e0: 20 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70   prefix of aSamp
b0f0: 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
b100: 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c  st .    ** sampl
b110: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
b120: 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c  r than pRec. Or,
b130: 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61   if i==pIdx->nSa
b140: 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20  mple then pRec. 
b150: 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20     ** is larger 
b160: 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
b170: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a   in the array. *
b180: 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  /.    tRowcnt iU
b190: 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
b1a0: 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  if( i>=pIdx->nSa
b1b0: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55  mple ){.      iU
b1c0: 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pper = sqlite3Lo
b1d0: 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e  gEstToInt(pIdx->
b1e0: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
b1f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b200: 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
b210: 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
b220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
b230: 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
b240: 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
b250: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
b260: 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
b270: 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
b280: 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
b290: 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
b2a0: 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
b2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b2c0: 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
b2d0: 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
b2e0: 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
b2f0: 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
b300: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e 46   pIdx->aAvgEq[nF
b310: 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20  ield-1];.  }..  
b320: 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 70  /* Restore the p
b330: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75  Rec->nField valu
b340: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
b350: 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e  ng.  */.  pRec->
b360: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
b370: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23  .  return i;.}.#
b380: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b390: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
b3a0: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
b3b0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
b3c0: 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
b3d0: 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
b3e0: 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
b3f0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
b400: 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
b410: 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
b420: 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
b430: 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
b440: 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
b450: 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
b460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
b470: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
b480: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
b490: 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
b4a0: 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
b4b0: 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
b4c0: 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
b4d0: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
b4e0: 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
b4f0: 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
b500: 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
b510: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
b520: 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
b530: 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
b540: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b550: 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
b560: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
b570: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
b580: 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
b590: 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
b5a0: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
b5b0: 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
b5c0: 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
b5d0: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
b5e0: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
b5f0: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
b600: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
b610: 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
b620: 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
b630: 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
b640: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
b650: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
b660: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
b670: 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
b680: 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
b690: 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
b6a0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
b6b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
b6c0: 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
b6d0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
b6e0: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
b6f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b700: 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69  urn nRet;.}...#i
b710: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b720: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
b730: 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  4./*.** Return t
b740: 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20  he affinity for 
b750: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
b760: 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  of an index..*/.
b770: 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65  char sqlite3Inde
b780: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
b790: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
b7a0: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43  ex *pIdx, int iC
b7b0: 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ol){.  assert( i
b7c0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
b7d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
b7e0: 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f    if( !pIdx->zCo
b7f0: 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20  lAff ){.    if( 
b800: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
b810: 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64 78  nityStr(db, pIdx
b820: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
b830: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
b840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78   }.  return pIdx
b850: 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b  ->zColAff[iCol];
b860: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
b870: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b880: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
b890: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
b8a0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
b8b0: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
b8c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
b8d0: 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61  sited by a.** ra
b8e0: 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b  nge-scan on a sk
b8f0: 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46  ip-scan index. F
b900: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
b910: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
b920: 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20   i1 ON t1(a, b, 
b930: 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  c);.**   SELECT 
b940: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
b950: 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45  a=? AND c BETWEE
b960: 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a  N ? AND ?;.**.**
b970: 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f   Value pLoop->nO
b980: 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ut is currently 
b990: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
b9a0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
b9b0: 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  ows .** visited 
b9c0: 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d  for scanning (a=
b9d0: 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73  ? AND b=?). This
b9e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65   function reduce
b9f0: 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65 20  s that estimate 
ba00: 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74  .** by some fact
ba10: 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  or to account fo
ba20: 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45 4e  r the (c BETWEEN
ba30: 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73   ? AND ?) expres
ba40: 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e  sion based.** on
ba50: 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61 20   the stat4 data 
ba60: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74  for the index. t
ba70: 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  his scan will be
ba80: 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70   peformed multip
ba90: 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e  le .** times (on
baa0: 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62  ce for each (a,b
bab0: 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68  ) combination th
bac0: 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20  at matches a=?) 
bad0: 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a  is dealt with .*
bae0: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
baf0: 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74  .**.** It does t
bb00: 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  his by scanning 
bb10: 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74  through all stat
bb20: 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61  4 samples, compa
bb30: 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65  ring values.** e
bb40: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
bb50: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
bb60: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70  with the corresp
bb70: 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e  onding column in
bb80: 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e   each.** sample.
bb90: 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20   If L and U are 
bba0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
bbb0: 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62  mples found to b
bbc0: 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a  e less than or.*
bbd0: 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76  * equal to the v
bbe0: 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20  alues extracted 
bbf0: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
bc00: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
bc10: 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73  ely, and.** N is
bc20: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
bc30: 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68  r of samples, th
bc40: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61  e pLoop->nOut va
bc50: 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a  lue is adjusted.
bc60: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
bc70: 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f  *.**   nOut = nO
bc80: 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c  ut * ( min(U - L
bc90: 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a  , 1) / N ).**.**
bca0: 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   If pLower is NU
bcb0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
bcc0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
bcd0: 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d  ed from the term
bce0: 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  , L is.** set to
bcf0: 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72   zero. If pUpper
bd00: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76   is NULL, or a v
bd10: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65  alue cannot be e
bd20: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
bd30: 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f  ,.** U is set to
bd40: 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c   N..**.** Normal
bd50: 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
bd60: 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74  n sets *pbDone t
bd70: 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72  o 1 before retur
bd80: 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ning. However,.*
bd90: 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61  * if no value ca
bda0: 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  n be extracted f
bdb0: 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65  rom either pLowe
bdc0: 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64  r or pUpper (and
bdd0: 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d   so the.** estim
bde0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
bdf0: 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65  r of rows delive
be00: 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  red remains unch
be10: 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a  anged), *pbDone.
be20: 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69 73  ** is left as is
be30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
be40: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
be50: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
be60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
be70: 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c  herwise, .** SQL
be80: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
be90: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
bea0: 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50  SkipScanEst(.  P
beb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bec0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
bed0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
bee0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
bef0: 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
bf00: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
bf10: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
bf20: 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
bf30: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
bf40: 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
bf50: 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
bf60: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
bf70: 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
bf80: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
bf90: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
bfa0: 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ,    /* Update t
bfb0: 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f  he .nOut value o
bfc0: 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  f this loop */. 
bfd0: 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20   int *pbDone    
bfe0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
bff0: 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
c000: 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65   one expr. value
c010: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b   extracted */.){
c020: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
c030: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
c040: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
c050: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
c060: 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nEq;.  sqlite3 *
c070: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c080: 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20  .  int nLower = 
c090: 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72  -1;.  int nUpper
c0a0: 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b   = p->nSample+1;
c0b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c0c0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20  TE_OK;.  u8 aff 
c0d0: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
c0e0: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c  lumnAffinity(db,
c0f0: 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c   p, nEq);.  Coll
c100: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20  Seq *pColl;.  . 
c110: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c120: 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
c130: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
c140: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
c150: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
c160: 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20  ue *p2 = 0;     
c170: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
c180: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70  tracted from pUp
c190: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
c1a0: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
c1b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
c1c0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
c1d0: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43   record */..  pC
c1e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
c1f0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
c200: 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71  e, p->azColl[nEq
c210: 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  ]);.  if( pLower
c220: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c230: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
c240: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
c250: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
c260: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b  ight, aff, &p1);
c270: 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b  .    nLower = 0;
c280: 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
c290: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
c2a0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
c2b0: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
c2c0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
c2d0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
c2e0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32  pRight, aff, &p2
c2f0: 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20  );.    nUpper = 
c300: 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d  p2 ? 0 : p->nSam
c310: 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ple;.  }..  if( 
c320: 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
c330: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
c340: 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Diff;.    for(i=
c350: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
c360: 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65   && i<p->nSample
c370: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
c380: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43   = sqlite3Stat4C
c390: 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61  olumn(db, p->aSa
c3a0: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53  mple[i].p, p->aS
c3b0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c  ample[i].n, nEq,
c3c0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
c3d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c3e0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
c3f0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
c400: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31  te3MemCompare(p1
c410: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
c420: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
c430: 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20  =0 ) nLower++;. 
c440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c460: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
c470: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
c480: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20  3MemCompare(p2, 
c490: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
c4a0: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
c4b0: 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20   ) nUpper++;.   
c4c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
c4d0: 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d  Diff = (nUpper -
c4e0: 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66   nLower);.    if
c4f0: 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69  ( nDiff<=0 ) nDi
c500: 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 1;..    /* 
c510: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
c520: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
c530: 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66  wer bound specif
c540: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20  ied, and the .  
c550: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
c560: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
c570: 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hey are close to
c580: 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20  gether, use the 
c590: 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  fallback.    ** 
c5a0: 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74  method (assume t
c5b0: 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73  hat the scan vis
c5c0: 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20  its 1/64 of the 
c5d0: 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61  rows) for estima
c5e0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
c5f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
c600: 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73  isited. Otherwis
c610: 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  e, estimate the 
c620: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
c630: 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
c640: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
c650: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63   in the header c
c660: 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  omment for this 
c670: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
c680: 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c   if( nDiff!=1 ||
c690: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c   pUpper==0 || pL
c6a0: 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ower==0 ){.     
c6b0: 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28   int nAdjust = (
c6c0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d  sqlite3LogEst(p-
c6d0: 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69  >nSample) - sqli
c6e0: 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29  te3LogEst(nDiff)
c6f0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  );.      pLoop->
c700: 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b  nOut -= nAdjust;
c710: 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d  .      *pbDone =
c720: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
c730: 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
c740: 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67  ge skip-scan reg
c750: 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64  ions: %u..%u  ad
c760: 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e  just=%d est=%d\n
c770: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
c790: 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41  ower, nUpper, nA
c7a0: 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d  djust*-1, pLoop-
c7b0: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a  >nOut));.    }..
c7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
c7d0: 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20  ert( *pbDone==0 
c7e0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
c7f0: 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a  3ValueFree(p1);.
c800: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
c810: 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p2);.  sqlite
c820: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
c830: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
c840: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c850: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
c860: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
c870: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c880: 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
c890: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
c8a0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
c8b0: 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
c8c0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
c8d0: 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
c8e0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
c8f0: 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
c900: 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
c910: 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
c920: 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
c930: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
c940: 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
c950: 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
c960: 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
c970: 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
c980: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
c990: 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
c9a0: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
c9b0: 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
c9c0: 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
c9d0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
c9e0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
c9f0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
ca20: 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
ca40: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
ca70: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
ca80: 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
ca90: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
caa0: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
cab0: 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
cac0: 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
cad0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
cae0: 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
caf0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
cb00: 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
cb10: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
cb20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
cb30: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
cb40: 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
cb50: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
cb60: 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
cb70: 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
cb80: 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
cb90: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
cba0: 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
cbb0: 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
cbc0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
cbd0: 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
cbe0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
cbf0: 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
cc00: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
cc10: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
cc20: 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
cc30: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
cc40: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
cc50: 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
cc60: 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
cc70: 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
cc80: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
cc90: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
cca0: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
ccb0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
ccc0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
ccd0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
cce0: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
ccf0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
cd00: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
cd10: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
cd20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
cd30: 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
cd40: 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
cd50: 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
cd60: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
cd70: 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
cd80: 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
cd90: 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
cda0: 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
cdb0: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
cdc0: 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
cdd0: 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e  q is 0, then *pn
cde0: 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Out is the numbe
cdf0: 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
ce00: 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
ce10: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
ce20: 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
ce30: 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
ce40: 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
ce50: 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
ce60: 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
ce70: 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
ce80: 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
ce90: 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
cea0: 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
ceb0: 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
cec0: 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
ced0: 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
cee0: 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
cef0: 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
cf00: 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
cf10: 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
cf20: 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
cf30: 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
cf40: 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
cf50: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
cf60: 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
cf70: 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
cf80: 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
cf90: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
cfa0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
cfb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
cfc0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
cfd0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
cfe0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
cff0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
d000: 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
d010: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
d020: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
d030: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
d040: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
d050: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
d060: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
d070: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
d080: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
d090: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
d0a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
d0b0: 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
d0c0: 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
d0d0: 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
d0e0: 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
d0f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d100: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
d110: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
d120: 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
d130: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d140: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
d150: 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
d160: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d170: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
d180: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
d190: 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
d1a0: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e  ->nSample>0 && n
d1b0: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
d1c0: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
d1d0: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
d1e0: 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  e->db, SQLITE_St
d1f0: 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20 20 69  at34).  ){.    i
d200: 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
d210: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
d220: 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
d230: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
d240: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
d250: 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
d260: 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d        int nBtm =
d270: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d280: 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nBtm;.      int 
d290: 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  nTop = pLoop->u.
d2a0: 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20  btree.nTop;..   
d2b0: 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
d2c0: 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65  Lower will be se
d2d0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
d2e0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
d2f0: 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20  of rows in .    
d300: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
d310: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
d320: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
d330: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
d340: 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20  uery. The.      
d350: 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62  ** lower bound b
d360: 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65  eing the concate
d370: 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64  nation of $P and
d380: 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73   $L, where $P is
d390: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65   the.      ** ke
d3a0: 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20  y-prefix formed 
d3b0: 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  by the nEq value
d3c0: 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  s matched agains
d3d0: 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d  t the nEq left-m
d3e0: 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ost.      ** col
d3f0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
d400: 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65  x, and $L is the
d410: 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72   value in pLower
d420: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
d430: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
d440: 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
d450: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
d460: 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
d470: 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a  ause it.      **
d480: 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
d490: 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74   variable or lit
d4a0: 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65  eral value), the
d4b0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
d4c0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e  the.      ** ran
d4d0: 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f  ge is $P. Due to
d4e0: 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20   a quirk in the 
d4f0: 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74  way whereKeyStat
d500: 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a  s() works, even.
d510: 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69        ** if $L i
d520: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
d530: 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
d540: 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
d550: 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20  ($P) and .      
d560: 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74  ** ($P:$L) and t
d570: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
d580: 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61   two returned va
d590: 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20  lues is used..  
d5a0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d5b0: 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
d5c0: 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
d5d0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
d5e0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d5f0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  rows.      ** le
d600: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
d610: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
d620: 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
d630: 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
d640: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  d.      ** is ei
d650: 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
d660: 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
d670: 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
d680: 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
d690: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55  s.      ** of iU
d6a0: 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
d6b0: 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
d6c0: 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
d6d0: 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
d6e0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
d6f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d700: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
d710: 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20   bounds is then 
d720: 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77  just iUpper-iLow
d730: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
d740: 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
d750: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
d760: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
d770: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
d780: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
d790: 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65  ;     /* Rows le
d7a0: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
d7b0: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
d7c0: 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d   int iLwrIdx = -
d7d0: 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  2;   /* aSample[
d7e0: 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20  ] for the lower 
d7f0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d800: 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b  nt iUprIdx = -1;
d810: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
d820: 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62 6f  for the upper bo
d830: 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  und */..      if
d840: 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( pRec ){.      
d850: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63    testcase( pRec
d860: 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64  ->nField!=pBuild
d870: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b  er->nRecValid );
d880: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
d890: 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72  Field = pBuilder
d8a0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20  ->nRecValid;.   
d8b0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
d8c0: 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
d8d0: 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
d8e0: 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
d8f0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
d900: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
d910: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
d920: 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
d930: 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
d940: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
d950: 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
d960: 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
d970: 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
d980: 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
d990: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
d9a0: 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
d9b0: 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
d9c0: 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
d9d0: 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
d9e0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
d9f0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
da00: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
da10: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
da20: 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
da30: 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
da40: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
da50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
da60: 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
da70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
da80: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
da90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
daa0: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
dab0: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
dac0: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
dad0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
dae0: 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
daf0: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
db00: 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
db10: 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
db20: 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
db30: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
db40: 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
db50: 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
db60: 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
db70: 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
db80: 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
db90: 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e       SWAP(int, n
dba0: 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20  Btm, nTop);.    
dbb0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
dbc0: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
dbd0: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
dbe0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
dbf0: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
dc00: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
dc10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
dc40: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
dc50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
dc60: 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
dc70: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
dc80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
dc90: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
dca0: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
dcb0: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
dcc0: 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b   nBtm, nEq, &n);
dcd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
dce0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
dcf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
dd00: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
dd10: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
dd20: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
dd30: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
dd40: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
dd50: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
dd60: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
dd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
dd80: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
dd90: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
dda0: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
ddb0: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
ddc0: 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
ddd0: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
dde0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
ddf0: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
de00: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
de10: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
de20: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
de30: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
de40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
de50: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
de60: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
de70: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
de80: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
de90: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
dea0: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
deb0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
dee0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
def0: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
df00: 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
df10: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
df20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
df30: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
df40: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
df50: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
df60: 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Top, nEq, &n);. 
df70: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
df80: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
df90: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
dfa0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
dfb0: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
dfc0: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
dfd0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
dfe0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
dff0: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
e000: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
e010: 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
e020: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
e030: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
e040: 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
e050: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
e060: 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
e070: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
e080: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
e090: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
e0a0: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
e0b0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
e0c0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
e0d0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
e0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e0f0: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
e100: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
e110: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e120: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e130: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
e140: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
e150: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
e160: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
e170: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
e180: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
e190: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
e1a0: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
e1b0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
e1c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
e1d0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
e1e0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
e1f0: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
e200: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
e210: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
e220: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
e230: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
e240: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
e250: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
e260: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
e270: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
e280: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
e290: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
e2a0: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
e2b0: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
e2c0: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
e2d0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
e2e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e2f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
e300: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
e310: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
e320: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
e330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e340: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
e350: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
e360: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
e370: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
e380: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
e390: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
e3a0: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
e3b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
e3d0: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
e3e0: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
e3f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e400: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
e410: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
e420: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
e430: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
e440: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
e450: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
e460: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
e470: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e480: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
e490: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e4a0: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
e4b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
e4c0: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
e4d0: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
e4e0: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
e4f0: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
e500: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
e510: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
e520: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
e530: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
e540: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
e550: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
e560: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
e570: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
e580: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
e590: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
e5a0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
e5b0: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
e5c0: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
e5d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
e5e0: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
e5f0: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
e600: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
e610: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
e620: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
e630: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
e640: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
e650: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
e660: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
e670: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
e680: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
e690: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
e6a0: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
e6b0: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
e6c0: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
e6d0: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
e6e0: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
e6f0: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
e700: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
e710: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
e720: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
e730: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
e740: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
e750: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
e760: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
e770: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
e780: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
e790: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
e7a0: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
e7b0: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
e7c0: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
e7d0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
e7e0: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
e7f0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
e800: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
e810: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
e820: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
e830: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
e840: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e850: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
e860: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
e870: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
e880: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
e890: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
e8a0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
e8b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e8c0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
e8d0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
e8e0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
e8f0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e900: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
e910: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
e920: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
e930: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
e940: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
e950: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
e960: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
e970: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
e980: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
e990: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
e9a0: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
e9b0: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
e9c0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
e9d0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
e9e0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
e9f0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
ea00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
ea10: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
ea20: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
ea30: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
ea40: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
ea50: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
ea60: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
ea70: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
ea80: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
ea90: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
eaa0: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
eab0: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
eac0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
ead0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
eae0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
eaf0: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
eb00: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
eb10: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
eb20: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
eb30: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
eb40: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
eb50: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
eb60: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
eb70: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
eb80: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
eb90: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
eba0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
ebb0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
ebc0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
ebd0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
ebe0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ebf0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
ec00: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
ec10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
ec20: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
ec30: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
ec40: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
ec50: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
ec60: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
ec70: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
ec80: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
ec90: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
eca0: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
ecb0: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
ecc0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
ecd0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
ece0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
ecf0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
ed00: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
ed10: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
ed20: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
ed30: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
ed40: 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRec;.  int rc;
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
ed70: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
ed80: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eda0: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
edb0: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
edc0: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
edd0: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
ede0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
edf0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
ee00: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ee10: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
ee20: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
ee30: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
ee40: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
ee50: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
ee60: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
ee70: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
ee80: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
ee90: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
eea0: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
eeb0: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
eec0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
eed0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
eee0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
eef0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
ef00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
ef10: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
ef20: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
ef30: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
ef40: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ef50: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
ef60: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
ef70: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
ef80: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
ef90: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
efa0: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
efb0: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
efc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
efd0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
efe0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
eff0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
f000: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
f010: 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  1, nEq-1, &bOk);
f020: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
f030: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
f040: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f050: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
f060: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
f070: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
f080: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
f090: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
f0a0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
f0b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
f0c0: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
f0d0: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
f0e0: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
f0f0: 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c  s %s(%d): %d\n",
f100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f110: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45      p->zName, nE
f120: 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  q-1, (int)a[1]))
f130: 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31  ;.  *pnRow = a[1
f140: 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  ];.  .  return r
f150: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
f160: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f170: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
f180: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f190: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
f1a0: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
f1b0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
f1c0: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
f1d0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
f1e0: 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f  d on.** an IN co
f1f0: 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74  nstraint where t
f200: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
f210: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
f220: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69  rator.** is a li
f230: 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45  st of values.  E
f240: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
f250: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
f260: 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20  (1,2,3,4).**.** 
f270: 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
f280: 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
f290: 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
f2a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
f2b0: 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
f2c0: 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
f2d0: 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
f2e0: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
f2f0: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
f300: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f310: 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
f320: 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
f330: 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
f340: 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
f350: 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
f360: 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
f370: 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
f380: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
f390: 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
f3a0: 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
f3b0: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
f3c0: 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
f3d0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
f3e0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
f3f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
f400: 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20  ereInScanEst(.  
f410: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f420: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f430: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
f440: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
f450: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
f460: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
f470: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
f480: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c    /* The value l
f490: 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ist on the RHS o
f4a0: 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76  f "x IN (v1,v2,v
f4b0: 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f  3,...)" */.  tRo
f4c0: 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
f4d0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
f4e0: 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
f4f0: 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
f500: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
f510: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
f520: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36  ree.pIndex;.  i6
f530: 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65  4 nRow0 = sqlite
f540: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e  3LogEstToInt(p->
f550: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
f560: 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64  .  int nRecValid
f570: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
f580: 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63  cValid;.  int rc
f590: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
f5a0: 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
f5b0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
f5c0: 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
f5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f5e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
f5f0: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
f600: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
f610: 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
f620: 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
f630: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
f640: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f670: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
f680: 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
f690: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
f6a0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
f6b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f6c0: 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b     nEst = nRow0;
f6d0: 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45  .    rc = whereE
f6e0: 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
f6f0: 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c  se, pBuilder, pL
f700: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
f710: 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
f720: 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
f730: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
f740: 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
f750: 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  d;.  }..  if( rc
f760: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f770: 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
f780: 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74   nRow0 ) nRowEst
f790: 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70   = nRow0;.    *p
f7a0: 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
f7b0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
f7c0: 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
f7d0: 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22  imate: est=%d\n"
f7e0: 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
f7f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
f800: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
f810: 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
f820: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
f830: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
f840: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
f850: 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57  T4 */...#ifdef W
f860: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f870: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  D./*.** Print th
f880: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
f890: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a  hereTerm object.
f8a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f8b0: 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68  hereTermPrint(Wh
f8c0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
f8d0: 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66  int iTerm){.  if
f8e0: 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ( pTerm==0 ){.  
f8f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f900: 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20  intf("TERM-%-3d 
f910: 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b  NULL\n", iTerm);
f920: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
f930: 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20  ar zType[4];.   
f940: 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b   char zLeft[50];
f950: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
f960: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
f970: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
f980: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
f990: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
f9a0: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
f9b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f9c0: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
f9d0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
f9e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
f9f0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
fa00: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
fa10: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
fa20: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fa30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
fa40: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20  SINGLE ){.      
fa50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
fa60: 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a  (sizeof(zLeft),z
fa70: 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25  Left,"left={%d:%
fa80: 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72              pTer
faa0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70  m->leftCursor, p
fab0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
fac0: 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  mn);.    }else i
fad0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
fae0: 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
faf0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   && pTerm->u.pOr
fb00: 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20  Info!=0 ){.     
fb10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fb20: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
fb30: 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65  zLeft,"indexable
fb40: 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20  =0x%lld", .     
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
fb70: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a  fo->indexable);.
fb80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fb90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fba0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
fbb0: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c  zLeft,"left=%d",
fbc0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
fbd0: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  or);.    }.    s
fbe0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fbf0: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
fc00: 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32 73  %-3d %p %s %-12s
fc10: 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78   prob=%-3d op=0x
fc20: 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25  %03x wtFlags=0x%
fc30: 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65  04x",.       iTe
fc40: 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65  rm, pTerm, zType
fc50: 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e  , zLeft, pTerm->
fc60: 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20  truthProb,.     
fc70: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
fc80: 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  or, pTerm->wtFla
fc90: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  gs);.    if( pTe
fca0: 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20  rm->iField ){.  
fcb0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
fcc0: 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d  Printf(" iField=
fcd0: 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46  %d\n", pTerm->iF
fce0: 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ield);.    }else
fcf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
fd00: 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
fd10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fd20: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
fd30: 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
fd40: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
fd50: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
fd60: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
fd70: 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  ** Show the comp
fd80: 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
fd90: 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f  a WhereClause.*/
fda0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
fdb0: 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68  reClausePrint(Wh
fdc0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
fdd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
fde0: 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  i=0; i<pWC->nTer
fdf0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65  m; i++){.    whe
fe00: 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43  reTermPrint(&pWC
fe10: 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a  ->a[i], i);.  }.
fe20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
fe30: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
fe40: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
fe50: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
fe60: 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
fe70: 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
fe80: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
fe90: 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
fea0: 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
feb0: 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
fec0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
fed0: 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
fee0: 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
fef0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
ff00: 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20  +3)/4;.  struct 
ff10: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
ff20: 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
ff30: 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
ff40: 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
ff50: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
ff60: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c  ;.  Bitmask mAll
ff70: 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   = (((Bitmask)1)
ff80: 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20  <<(nb*4)) - 1;. 
ff90: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
ffa0: 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
ffb0: 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
ffc0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
ffd0: 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
ffe0: 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
fff0: 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20  , nb, p->prereq 
10000 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  & mAll);.  sqlit
10010 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
10020 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %12s",.         
10030 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
10040 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
10050 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
10060 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
10070 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10080 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
10090 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
100a0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
100b0 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
100c0 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
100d0 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
100e0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
100f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
10100 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
10110 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
10120 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
10130 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
10140 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
10150 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
10160 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
10170 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
10180 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
10190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
101a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
101b0 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
101c0 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
101d0 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
101e0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
101f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
10200 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
10210 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
10220 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
10230 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
10240 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
10250 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
10260 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
10270 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
10280 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
10290 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
102a0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
102b0 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
102c0 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
102d0 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
102e0 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
102f0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
10300 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
10310 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
10320 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
10330 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
10340 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
10350 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
10360 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
10370 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
10380 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
10390 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e  %05x %d-%d", p->
103a0 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
103b0 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20  rm,p->nSkip);.  
103c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
103d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
103e0 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d  f %05x N %d", p-
103f0 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
10400 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  erm);.  }.  sqli
10410 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10420 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
10430 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
10440 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
10450 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
10460 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
10470 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
10480 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
10490 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
104a0 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
104b0 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
104c0 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b  Print(p->aLTerm[
104d0 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  i], i);.    }.  
104e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
104f0 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
10500 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
10510 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
10520 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
10530 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
10540 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
10550 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10560 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
10570 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
10580 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
10590 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
105a0 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
105b0 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
105c0 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
105d0 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
105e0 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
105f0 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
10600 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
10610 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
10620 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
10630 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10640 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
10650 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10660 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
10670 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
10680 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
10690 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
106a0 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
106b0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
106c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
106d0 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
106e0 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
106f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10700 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
10710 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
10720 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
10730 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
10740 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
10750 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
10760 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10770 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
10780 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
10790 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
107a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
107b0 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
107c0 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
107d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
107e0 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74  eeNN(db, p->u.bt
107f0 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
10800 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
10810 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
10820 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
10830 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
10840 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
10850 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10860 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10870 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
10880 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
10890 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
108a0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
108b0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
108c0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
108d0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
108e0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
108f0 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
10900 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
10910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
10920 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
10930 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
10940 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
10950 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
10960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
10970 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
10980 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
10990 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
109a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
109b0 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
109c0 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
109d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
109e0 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
109f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
10a00 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
10a10 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
10a20 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
10a30 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
10a40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10a50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  T;.  memcpy(paNe
10a60 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
10a70 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
10a80 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
10a90 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
10aa0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
10ab0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
10ac0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
10ad0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
10ae0 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
10af0 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
10b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10b10 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
10b20 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
10b30 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
10b40 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
10b50 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
10b60 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
10b70 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10b80 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
10b90 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
10ba0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
10bb0 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
10bc0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
10bd0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
10be0 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
10bf0 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
10c00 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
10c10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10c20 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10c30 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  }.  memcpy(pTo, 
10c40 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
10c50 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
10c60 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
10c70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
10c80 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
10c90 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
10ca0 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
10cb0 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
10cc0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
10cd0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
10ce0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
10cf0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
10d00 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
10d10 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
10d20 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
10d30 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
10d40 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
10d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10d60 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10d70 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10d80 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10d90 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
10da0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10db0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
10dc0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
10dd0 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
10de0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
10df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
10e00 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
10e10 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
10e20 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
10e30 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10e40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10e50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
10e60 73 65 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20  sert( pWInfo!=0 
10e70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
10e80 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
10e90 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  i++){.    WhereL
10ea0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
10eb0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
10ec0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57    if( pLevel->pW
10ed0 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d  Loop && (pLevel-
10ee0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
10ef0 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
10f00 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10f10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
10f20 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
10f30 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
10f40 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
10f50 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
10f60 3e 73 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20  >sWC);.  while( 
10f70 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
10f80 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  {.    WhereLoop 
10f90 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
10fa0 6f 70 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ops;.    pWInfo-
10fb0 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65  >pLoops = p->pNe
10fc0 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  xtLoop;.    wher
10fd0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
10fe0 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
10ff0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57  3DbFreeNN(db, pW
11000 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
11010 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
11020 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
11030 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
11040 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
11050 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
11060 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
11070 2a 20 20 20 28 32 29 20 20 58 20 75 73 65 73 20  *   (2)  X uses 
11080 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
11090 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a  se terms than Y.
110a0 2a 2a 20 20 20 28 33 29 20 20 45 76 65 72 79 20  **   (3)  Every 
110b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
110c0 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
110d0 6c 73 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a  lso used by Y.**
110e0 20 20 20 28 34 29 20 20 58 20 73 6b 69 70 73 20     (4)  X skips 
110f0 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
11100 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a   columns as Y.**
11110 20 20 20 28 35 29 20 20 49 66 20 58 20 69 73 20     (5)  If X is 
11120 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
11130 2c 20 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a  , than Y is too.
11140 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73  **.** Conditions
11150 20 28 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61   (2) and (3) mea
11160 6e 20 74 68 61 74 20 58 20 69 73 20 61 20 22 70  n that X is a "p
11170 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 6f 66  roper subset" of
11180 20 59 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61   Y..** If X is a
11190 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
111a0 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20  f Y then Y is a 
111b0 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e  better choice an
111c0 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61  d ought.** to ha
111d0 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e  ve a lower cost.
111e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
111f0 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e  eturns TRUE when
11200 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72   that cost .** r
11210 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69  elationship is i
11220 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64  nverted and need
11230 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  s to be adjusted
11240 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34  .  Constraint (4
11250 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62  ).** was added b
11260 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65 73  ecause if X uses
11270 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20   skip-scan less 
11280 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20  than Y it still 
11290 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65  might.** deserve
112a0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76   a lower cost ev
112b0 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72  en if it is a pr
112c0 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
112d0 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35  .  Constraint (5
112e0 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62  ).** was added b
112f0 65 63 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e  ecause a coverin
11300 67 20 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79  g index probably
11310 20 64 65 73 65 72 76 65 73 20 74 6f 20 68 61 76   deserves to hav
11320 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a  e a lower cost.*
11330 2a 20 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76  * than a non-cov
11340 65 72 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e  ering index even
11350 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
11360 65 72 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74  er subset..*/.st
11370 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
11380 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
11390 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
113a0 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
113b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
113c0 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
113d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
113e0 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
113f0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
11400 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
11410 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
11420 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
11430 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
11440 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
11450 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
11460 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
11470 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
11480 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
11490 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
114a0 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
114b0 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
114c0 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
114d0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
114e0 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
114f0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
11500 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
11510 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
11520 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
11530 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
11540 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
11550 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
11560 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
11570 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
11580 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
11590 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
115a0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
115b0 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
115c0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
115d0 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
115e0 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
115f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
11600 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
11610 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
11620 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
11630 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
11640 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
11650 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e  .  }.  if( (pX->
11660 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44  wsFlags&WHERE_ID
11670 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26  X_ONLY)!=0 .   &
11680 26 20 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57  & (pY->wsFlags&W
11690 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
116a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
116b0 30 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e  0;  /* Constrain
116c0 74 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72  t (5) */.  }.  r
116d0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
116e0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
116f0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
11700 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
11710 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
11720 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
11730 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
11740 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
11750 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
11760 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
11770 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
11780 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
11790 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
117a0 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
117b0 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
117c0 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
117d0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
117e0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
117f0 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
11800 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
11810 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
11820 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
11830 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
11840 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
11850 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
11860 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
11870 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11880 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
11890 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
118a0 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
118b0 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
118c0 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
118d0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
118e0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
118f0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
11900 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
11910 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
11920 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
11930 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
11940 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
11950 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
11960 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
11970 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
11980 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
11990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
119a0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
119b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
119c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
119d0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
119e0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
119f0 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
11a00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
11a10 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
11a20 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
11a30 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
11a40 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
11a50 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
11a60 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
11a70 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
11a80 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
11a90 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
11aa0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11ab0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
11ac0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
11ad0 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
11ae0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
11af0 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
11b00 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
11b10 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
11b20 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
11b30 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
11b40 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
11b50 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
11b60 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
11b70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
11b80 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
11b90 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
11ba0 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
11bb0 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
11bc0 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
11bd0 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
11be0 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
11bf0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
11c00 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
11c10 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
11c20 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11c50 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
11c60 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
11c70 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
11c80 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11c90 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
11ca0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
11cb0 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
11cc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
11cd0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
11ce0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
11cf0 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
11d00 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
11d10 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72  that can be.** r
11d20 65 70 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70  eplaced by pTemp
11d30 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  late..**.** Retu
11d40 72 6e 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70  rn NULL if pTemp
11d50 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
11d60 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72  long on the Wher
11d70 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49  eLoop list..** I
11d80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
11d90 20 70 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74   pTemplate ought
11da0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66   to be dropped f
11db0 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73  rom further cons
11dc0 69 64 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ideration..**.**
11dd0 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
11de0 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
11df0 6c 61 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65  late can replace
11e00 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
11e10 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70  e.** link that p
11e20 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a  oints to pX..**.
11e30 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20  ** If pTemplate 
11e40 63 61 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61  cannot replace a
11e50 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d  ny existing elem
11e60 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  ent of the list 
11e70 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20  but needs.** to 
11e80 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
11e90 6c 69 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e  list as a new en
11ea0 74 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  try, then return
11eb0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11ec0 65 0a 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65  e.** tail of the
11ed0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
11ee0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
11ef0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
11f00 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
11f10 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
11f20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
11f30 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
11f40 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
11f50 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
11f60 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
11f70 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
11f80 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
11f90 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
11fa0 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
11fb0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
11fc0 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
11fd0 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
11fe0 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
11ff0 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
12000 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
12010 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
12020 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
12030 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
12040 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
12050 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
12060 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
12070 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
12080 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
12090 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
120a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
120b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
120c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
120d0 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
120e0 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
120f0 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
12100 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
12110 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
12120 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
12130 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
12140 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
12150 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
12160 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
12170 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
12180 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
12190 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
121a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
121b0 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
121c0 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
121d0 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
121e0 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
121f0 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
12200 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
12210 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
12220 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
12230 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
12240 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
12250 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
12260 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
12270 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
12280 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
12290 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
122a0 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
122b0 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
122c0 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
122d0 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
122e0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
122f0 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
12300 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
12310 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
12320 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
12330 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
12340 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
12350 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
12360 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
12370 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
12380 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
12390 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
123a0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
123b0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
123c0 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
123d0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
123e0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
123f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
12400 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
12410 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
12420 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
12430 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
12440 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
12450 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
12460 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
12470 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
12480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12490 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
124a0 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
124b0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
124c0 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
124d0 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
124e0 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
124f0 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
12500 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
12510 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
12520 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
12530 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
12540 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
12550 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
12560 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
12570 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
12580 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
12590 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
125a0 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
125b0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
125c0 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
125d0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
125e0 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
125f0 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
12600 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
12610 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
12640 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
12650 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
12680 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
12690 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
126a0 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
126b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
126c0 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
126d0 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
126e0 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
126f0 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
12700 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
12710 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
12720 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
12730 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
12740 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
12750 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
12760 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
12770 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
12780 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
12790 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
127a0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
127b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
127c0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
127d0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
127e0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
127f0 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
12800 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
12810 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
12820 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12840 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
12850 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
12860 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
12890 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
128a0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
128b0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
128c0 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
128d0 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
128e0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
128f0 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
12900 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
12910 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
12920 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12930 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
12940 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
12950 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
12960 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
12970 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
12980 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
12990 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
129a0 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
129b0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
129c0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
129d0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
129e0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
129f0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
12a00 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
12a10 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
12a20 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
12a30 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
12a40 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
12a50 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
12a60 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
12a70 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
12a80 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
12a90 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
12aa0 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
12ab0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
12ac0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
12ad0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
12ae0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
12af0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
12b00 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
12b10 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
12b20 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
12b30 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
12b40 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
12b50 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
12b60 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
12b70 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
12b80 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
12b90 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
12ba0 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
12bb0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
12bc0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
12bd0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
12be0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
12bf0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
12c00 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
12c10 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
12c20 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
12c30 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
12c40 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
12c50 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
12c60 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
12c70 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
12c80 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
12c90 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
12ca0 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
12cb0 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
12cc0 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
12cd0 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
12ce0 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
12cf0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
12d00 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
12d10 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
12d20 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
12d30 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
12d40 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
12d50 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
12d60 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
12d70 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
12d80 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
12d90 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
12da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
12db0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
12dc0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
12dd0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
12de0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
12df0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
12e00 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
12e10 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
12e20 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
12e30 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
12e40 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
12e50 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  e->db;.  int rc;
12e60 0a 0a 20 20 2f 2a 20 53 74 6f 70 20 74 68 65 20  ..  /* Stop the 
12e70 73 65 61 72 63 68 20 6f 6e 63 65 20 77 65 20 68  search once we h
12e80 69 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  it the query pla
12e90 6e 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69  nner search limi
12ea0 74 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  t */.  if( pBuil
12eb0 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 3d  der->iPlanLimit=
12ec0 3d 30 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  =0 ){.    WHERET
12ed0 52 41 43 45 28 30 78 66 66 66 66 66 66 66 66 2c  RACE(0xffffffff,
12ee0 28 22 3d 3d 3d 20 71 75 65 72 79 20 70 6c 61 6e  ("=== query plan
12ef0 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74  ner search limit
12f00 20 72 65 61 63 68 65 64 20 3d 3d 3d 5c 6e 22 29   reached ===\n")
12f10 29 3b 0a 20 20 20 20 69 66 28 20 70 42 75 69 6c  );.    if( pBuil
12f20 64 65 72 2d 3e 70 4f 72 53 65 74 20 29 20 70 42  der->pOrSet ) pB
12f30 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
12f40 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
12f50 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
12f60 20 7d 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 69   }.  pBuilder->i
12f70 50 6c 61 6e 4c 69 6d 69 74 2d 2d 3b 0a 0a 20 20  PlanLimit--;..  
12f80 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
12f90 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
12fa0 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
12fb0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
12fc0 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
12fd0 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
12fe0 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
12ff0 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  et!=0 ){.    if(
13000 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65   pTemplate->nLTe
13010 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  rm ){.#if WHERET
13020 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
13030 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c     u16 n = pBuil
13040 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a  der->pOrSet->n;.
13050 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65        int x =.#e
13060 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65  ndif.      where
13070 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  OrInsert(pBuilde
13080 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70  r->pOrSet, pTemp
13090 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54  late->prereq, pT
130a0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20  emplate->rRun,. 
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
130e0 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52  ut);.#if WHERETR
130f0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
13100 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
13110 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
13120 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
13130 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
13140 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
13150 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
13160 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   ", n);.        
13170 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
13180 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
13190 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
131a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
131b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
131c0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  _OK;.  }..  /* L
131d0 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
131e0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  ing WhereLoop to
131f0 20 72 65 70 6c 61 63 65 20 77 69 74 68 20 70 54   replace with pT
13200 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77  emplate.  */.  w
13210 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
13220 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  st(pWInfo->pLoop
13230 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  s, pTemplate);. 
13240 20 70 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c   ppPrev = whereL
13250 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70  oopFindLesser(&p
13260 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
13270 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66  Template);..  if
13280 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20  ( ppPrev==0 ){. 
13290 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65     /* There alre
132a0 61 64 79 20 65 78 69 73 74 73 20 61 20 57 68 65  ady exists a Whe
132b0 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69  reLoop on the li
132c0 73 74 20 74 68 61 74 20 69 73 20 62 65 74 74 65  st that is bette
132d0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54  r.    ** than pT
132e0 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74  emplate, so just
132f0 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74   ignore pTemplat
13300 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52  e */.#if WHERETR
13310 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
13320 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  x8 */.    if( sq
13330 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13340 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73  & 0x8 ){.      s
13350 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
13360 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a  f("   skip: ");.
13370 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
13380 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
13390 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
133a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
133b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
133c0 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  K;  .  }else{.  
133d0 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20    p = *ppPrev;. 
133e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
133f0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
13400 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
13410 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
13420 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
13430 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
13440 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
13450 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
13460 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
13470 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
13480 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
13490 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45  it..  */.#if WHE
134a0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
134b0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
134c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
134d0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69  e & 0x8 ){.    i
134e0 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( p!=0 ){.     
134f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
13500 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29  ntf("replace: ")
13510 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
13520 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64  pPrint(p, pBuild
13530 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
13540 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
13550 74 66 28 22 20 20 20 77 69 74 68 3a 20 22 29 3b  tf("   with: ");
13560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13570 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
13580 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a 20 22  intf("    add: "
13590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65  );.    }.    whe
135a0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
135b0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
135c0 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
135d0 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  f.  if( p==0 ){.
135e0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
135f0 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
13600 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e  to add to the en
13610 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f  d of the list */
13620 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70  .    *ppPrev = p
13630 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
13640 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
13650 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
13660 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
13670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13680 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77 68 65  EM_BKPT;.    whe
13690 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
136a0 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
136b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
136c0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
136d0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
136e0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
136f0 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
13700 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
13710 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
13720 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
13730 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
13740 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
13750 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
13760 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
13770 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
13780 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
13790 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
137a0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
137b0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
137c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
137d0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
137e0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
137f0 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
13800 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
13810 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
13820 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13830 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
13840 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
13850 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
13860 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
13870 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
13880 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
13890 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
138a0 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
138b0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
138c0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
138d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
138e0 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
138f0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
13900 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
13910 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
13920 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13930 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
13940 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
13950 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
13960 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66  rc = whereLoopXf
13970 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
13980 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ate);.  if( (p->
13990 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
139a0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
139b0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
139c0 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
139d0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
139e0 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
139f0 64 65 78 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51  dex->idxType==SQ
13a00 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b  LITE_IDXTYPE_IPK
13a10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
13a20 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
13a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13a40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13a50 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72   Adjust the Wher
13a60 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65  eLoop.nOut value
13a70 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63   downward to acc
13a80 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f  ount for terms o
13a90 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  f the.** WHERE c
13aa0 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
13ab0 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75  ence the loop bu
13ac0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
13ad0 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e  used by an.** in
13ae0 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76  dex..*.** For ev
13af0 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
13b00 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f   term that is no
13b10 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  t used by the in
13b20 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68  dex.** and which
13b30 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f   has a truth pro
13b40 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65  bability assigne
13b50 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  d by one of the 
13b60 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a  likelihood(),.**
13b70 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e   likely(), or un
13b80 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e  likely() SQL fun
13b90 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74  ctions, reduce t
13ba0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
13bb0 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74  ber.** of output
13bc0 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f   rows by the pro
13bd0 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69  bability specifi
13be0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47  ed..**.** TUNING
13bf0 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  :  For every WHE
13c00 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
13c10 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
13c20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
13c30 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e  and which does n
13c40 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  ot have an assig
13c50 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62  ned truth probab
13c60 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63  ility, heuristic
13c70 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62  s.** described b
13c80 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f  elow are used to
13c90 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
13ca0 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
13cb0 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20  bility..** TODO 
13cc0 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73  --> Perhaps this
13cd0 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
13ce0 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72  at could be impr
13cf0 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a  oved by better.*
13d00 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69  * table statisti
13d10 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  cs..**.** Heuris
13d20 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65  tic 1:  Estimate
13d30 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
13d40 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25  bility as 93.75%
13d50 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a  .  The 93.75%.**
13d60 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e   value correspon
13d70 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45  ds to -1 in LogE
13d80 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20  st notation, so 
13d90 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65  this means decre
13da0 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72  ment.** the Wher
13db0 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64  eLoop.nOut field
13dc0 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20   for every such 
13dd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
13de0 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  m..**.** Heurist
13df0 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20  ic 2:  If there 
13e00 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f  exists one or mo
13e10 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
13e20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
13e30 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61  form "x==EXPR" a
13e40 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61  nd EXPR is not a
13e50 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31   constant 0 or 1
13e60 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
13e70 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75   the.** final ou
13e80 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
13e90 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20  e is no greater 
13ea0 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20  than 1/4 of the 
13eb0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20  total number.** 
13ec0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
13ed0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
13ee0 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68  words, assume th
13ef0 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20  at x==EXPR will 
13f00 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74  filter.** out at
13f10 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20   least 3 out of 
13f20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52  4 rows.  If EXPR
13f30 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31   is -1 or 0 or 1
13f40 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65  , then maybe the
13f50 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69  .** "x" column i
13f60 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73  s boolean or els
13f70 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69  e -1 or 0 or 1 i
13f80 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75  s a common defau
13f90 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74  lt value.** on t
13fa0 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e  he "x" column an
13fb0 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  d so in that cas
13fc0 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f  e only cap the o
13fd0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
13fe0 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73  te.** at 1/2 ins
13ff0 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a  tead of 1/4..*/.
14000 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
14010 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
14020 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
14030 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54   *pWC,      /* T
14040 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14050 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
14060 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54  pLoop,      /* T
14070 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73  he loop to adjus
14080 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20  t downward */.  
14090 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20  LogEst nRow     
140a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
140b0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
140c0 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a  entire table */.
140d0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
140e0 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69  pTerm, *pX;.  Bi
140f0 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64  tmask notAllowed
14100 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72   = ~(pLoop->prer
14110 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  eq|pLoop->maskSe
14120 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  lf);.  int i, j,
14130 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65   k;.  LogEst iRe
14140 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  duce = 0;    /* 
14150 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75  pLoop->nOut shou
14160 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52  ld not exceed nR
14170 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20  ow-iReduce */.. 
14180 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
14190 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
141a0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
141b0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  );.  for(i=pWC->
141c0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
141d0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
141e0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
141f0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
14200 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
14210 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
14220 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
14230 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
14240 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
14250 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14260 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
14270 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
14280 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
14290 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
142a0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
142b0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
142c0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
142d0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
142e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
142f0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
14300 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
14310 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
14320 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
14330 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
14340 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
14350 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
14360 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
14370 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
14380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
14390 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62   If a truth prob
143a0 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69  ability is speci
143b0 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c  fied using the l
143c0 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74  ikelihood() hint
143d0 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  s,.        ** th
143e0 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61  en use the proba
143f0 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20  bility provided 
14400 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
14410 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
14420 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  Loop->nOut += pT
14430 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
14440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14450 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61       /* In the a
14460 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63  bsence of explic
14470 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  it truth probabi
14480 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72  lities, use heur
14490 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20  istics to.      
144a0 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61    ** guess a rea
144b0 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72  sonable truth pr
144c0 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20  obability. */.  
144d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
144e0 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t--;.        if(
144f0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14500 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  r&(WO_EQ|WO_IS) 
14510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
14520 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
14530 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
14540 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14550 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
14560 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
14570 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
14580 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
14590 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20  ger(pRight, &k) 
145a0 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c  && k>=(-1) && k<
145b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
145c0 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    k = 10;.      
145d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
145e0 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20         k = 20;. 
145f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14600 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65       if( iReduce
14610 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b  <k ) iReduce = k
14620 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14630 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14640 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  if( pLoop->nOut 
14650 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29  > nRow-iReduce )
14660 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
14670 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a  nRow - iReduce;.
14680 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70  }../* .** Term p
14690 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72  Term is a vector
146a0 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
146b0 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  n operation. The
146c0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
146d0 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74  n.** in the vect
146e0 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  or can be optimi
146f0 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  zed using column
14700 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65   nEq of the inde
14710 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  x. This.** funct
14720 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
14730 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
14740 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20  vector elements 
14750 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
14760 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74  .** as part of t
14770 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69  he range compari
14780 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  son..**.** For e
14790 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
147a0 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
147b0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
147c0 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c   (b, c, d) > (?,
147d0 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64   ?, ?).**.** and
147e0 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a   the index:.**.*
147f0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
14800 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63   ... ON (a, b, c
14810 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68  , d, e).**.** th
14820 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14830 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65   would be invoke
14840 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68  d with nEq=1. Th
14850 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
14860 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65   in.** this case
14870 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   is 3..*/.static
14880 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56   int whereRangeV
14890 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73  ectorLen(.  Pars
148a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
148b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
148c0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ext */.  int iCu
148d0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
148e0 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
148f0 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
14900 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f  *pIdx,         /
14910 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
14920 65 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65  e used for a ine
14930 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
14940 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  nt */.  int nEq,
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14960 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20  Number of prior 
14970 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
14980 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64  ints on same ind
14990 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
149a0 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20  m *pTerm     /* 
149b0 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75  The vector inequ
149c0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
149d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
149e0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  p = sqlite3ExprV
149f0 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d  ectorSize(pTerm-
14a00 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
14a10 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70    int i;..  nCmp
14a20 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49   = MIN(nCmp, (pI
14a30 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45  dx->nColumn - nE
14a40 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  q));.  for(i=1; 
14a50 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmp; i++){.  
14a60 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d    /* Test if com
14a70 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65  parison i of pTe
14a80 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  rm is compatible
14a90 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b   with column (i+
14aa0 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20  nEq) .    ** of 
14ab0 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f  the index. If no
14ac0 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70  t, exit the loop
14ad0 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61  .  */.    char a
14ae0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
14af0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
14b00 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a  rison affinity *
14b10 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61 66  /.    char idxaf
14b20 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
14b30 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63      /* Indexed c
14b40 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
14b50 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
14b60 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
14b70 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
14b80 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  on collation seq
14b90 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70  uence */.    Exp
14ba0 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d  r *pLhs = pTerm-
14bb0 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78  >pExpr->pLeft->x
14bc0 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
14bd0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  pr;.    Expr *pR
14be0 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  hs = pTerm->pExp
14bf0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
14c00 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
14c10 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
14c20 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52  .      pRhs = pR
14c30 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  hs->x.pSelect->p
14c40 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14c50 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
14c60 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d      pRhs = pRhs-
14c70 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
14c80 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Expr;.    }..   
14c90 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
14ca0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f  he LHS of the co
14cb0 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14cc0 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74  lumn reference t
14cd0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  o.    ** the rig
14ce0 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ht column of the
14cf0 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74 61   right source ta
14d00 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ble. And that th
14d10 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72  e sort.    ** or
14d20 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  der of the index
14d30 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73   column is the s
14d40 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74 20  ame as the sort 
14d50 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20  order of the.   
14d60 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64   ** leftmost ind
14d70 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  ex column.  */. 
14d80 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21     if( pLhs->op!
14d90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20  =TK_COLUMN .    
14da0 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65   || pLhs->iTable
14db0 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20  !=iCur .     || 
14dc0 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  pLhs->iColumn!=p
14dd0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b  Idx->aiColumn[i+
14de0 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49  nEq] .     || pI
14df0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
14e00 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f  +nEq]!=pIdx->aSo
14e10 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20  rtOrder[nEq].   
14e20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
14e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
14e40 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c  case( pLhs->iCol
14e50 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b  umn==XN_ROWID );
14e60 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
14e70 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14e80 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45  y(pRhs, sqlite3E
14e90 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73  xprAffinity(pLhs
14ea0 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d  ));.    idxaff =
14eb0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14ec0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78  umnAffinity(pIdx
14ed0 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e  ->pTable, pLhs->
14ee0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66  iColumn);.    if
14ef0 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29 20  ( aff!=idxaff ) 
14f00 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c  break;..    pCol
14f10 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
14f20 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
14f30 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
14f40 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  hs);.    if( pCo
14f50 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ll==0 ) break;. 
14f60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
14f70 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
14f80 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
14f90 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b  [i+nEq]) ) break
14fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
14fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
14fc0 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20  t the cost C by 
14fd0 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63  the costMult fac
14fe0 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c  ter T.  This onl
14ff0 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63  y occurs if.** c
15000 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53  ompiled with -DS
15010 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
15020 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20  TMULT.*/.#ifdef 
15030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
15040 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20  STMULT.# define 
15050 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
15060 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54  ier(C,T)  C += T
15070 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15080 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
15090 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a  ier(C,T).#endif.
150a0 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
150b0 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
150c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
150d0 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
150e0 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  of the .** index
150f0 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20   pIndex. Try to 
15100 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
15110 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
15120 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15130 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  ed, pBuilder->pN
15140 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e  ew->nOut contain
15150 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72  s the .** number
15160 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
15170 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
15180 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69  by filtering usi
15190 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74  ng the nEq .** t
151a0 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74  erms only. If it
151b0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68   is modified, th
151c0 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74  is value is rest
151d0 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  ored before this
151e0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
151f0 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  turns..**.** If 
15200 70 50 72 6f 62 65 2d 3e 69 64 78 54 79 70 65 3d  pProbe->idxType=
15210 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
15220 49 50 4b 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  IPK, that means 
15230 70 49 6e 64 65 78 20 69 73 20 0a 2a 2a 20 61 20  pIndex is .** a 
15240 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
15250 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20  for the INTEGER 
15260 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a  PRIMARY KEY..*/.
15270 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
15280 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15290 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  x(.  WhereLoopBu
152a0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
152b0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
152c0 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f  eLoop factory */
152d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
152e0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
152f0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
15300 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
15310 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
15320 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20   *pProbe,       
15330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15340 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a   index on pSrc *
15350 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75  /.  LogEst nInMu
15360 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
15370 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65      /* log(Numbe
15380 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
15390 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b  due to IN) */.){
153a0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
153b0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
153c0 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45  >pWInfo;  /* WHE
153d0 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65  RE analyse conte
153e0 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
153f0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
15400 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f  pParse;        /
15410 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15420 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
15430 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15440 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
15450 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  se connection ma
15460 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lloc context */.
15470 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
15480 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
15490 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
154a0 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f  ereLoop under co
154b0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
154c0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
154d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
154e0 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75  /* A WhereTerm u
154f0 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  nder considerati
15500 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61  on */.  int opMa
15510 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
15520 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64          /* Valid
15530 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63   operators for c
15540 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
15550 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20  WhereScan scan; 
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
15580 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20  WHERE terms */. 
15590 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70   Bitmask saved_p
155a0 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20  rereq;          
155b0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
155c0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72  ue of pNew->prer
155d0 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  eq */.  u16 save
155e0 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  d_nLTerm;       
155f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15600 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15610 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75  w->nLTerm */.  u
15620 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20  16 saved_nEq;   
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15640 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
15650 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
15660 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73  e.nEq */.  u16 s
15670 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20  aved_nBtm;      
15680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
15690 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
156a0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
156b0 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  tm */.  u16 save
156c0 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20 20 20  d_nTop;         
156d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
156e0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
156f0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
15700 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
15710 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
15720 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
15730 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
15740 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
15750 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
15760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
15770 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
15780 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
15790 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
157a0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
157b0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
157c0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
157d0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ut */.  int rc =
157e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
157f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15800 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
15810 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
15820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15830 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
15840 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
15850 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
15880 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
15890 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
158a0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
158b0 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
158c0 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
158d0 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
158e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
158f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15900 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
15910 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15920 50 54 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  PT;.  WHERETRACE
15930 28 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20  (0x800, ("BEGIN 
15940 25 73 2e 61 64 64 42 74 72 65 65 49 64 78 28 25  %s.addBtreeIdx(%
15950 73 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  s), nEq=%d\n",. 
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62      pProbe->pTab
15980 6c 65 2d 3e 7a 4e 61 6d 65 2c 70 50 72 6f 62 65  le->zName,pProbe
15990 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75  ->zName, pNew->u
159a0 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20  .btree.nEq));.. 
159b0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
159c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
159d0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
159e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
159f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
15a00 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
15a10 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
15a20 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15a30 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
15a40 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
15a50 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
15a60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
15a70 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
15a80 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73  ==0 );.    opMas
15a90 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
15aa0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
15ab0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c  T|WO_LE|WO_ISNUL
15ac0 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69  L|WO_IS;.  }.  i
15ad0 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
15ae0 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
15af0 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
15b00 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
15b10 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
15b20 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
15b30 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  e->nColumn );.. 
15b40 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
15b50 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
15b60 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70    saved_nBtm = p
15b70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
15b80 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70 20  m;.  saved_nTop 
15b90 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
15ba0 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53  nTop;.  saved_nS
15bb0 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69  kip = pNew->nSki
15bc0 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
15bd0 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
15be0 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
15bf0 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
15c00 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
15c10 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
15c20 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
15c30 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
15c40 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
15c50 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
15c60 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
15c70 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f  >iCursor, saved_
15c80 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nEq,.           
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
15ca0 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
15cb0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
15cc0 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f  ;.  rSize = pPro
15cd0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15ce0 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  0];.  rLogSize =
15cf0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
15d00 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
15d10 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
15d20 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
15d30 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
15d40 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20  {.    u16 eOp = 
15d50 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15d60 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64  ;   /* Shorthand
15d70 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65   for pTerm->eOpe
15d80 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67  rator */.    Log
15d90 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20  Est rCostIdx;.  
15da0 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61    LogEst nOutUna
15db0 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20  djusted;        
15dc0 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49  /* nOut before I
15dd0 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64  N() and WHERE ad
15de0 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  justments */.   
15df0 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69   int nIn = 0;.#i
15e00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15e10 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
15e20 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  4.    int nRecVa
15e30 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
15e40 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
15e50 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d  f.    if( (eOp==
15e60 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
15e70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
15e80 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
15e90 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e    && indexColumn
15ea0 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20  NotNull(pProbe, 
15eb0 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29  saved_nEq).    )
15ec0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
15ed0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
15ee0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
15ef0 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
15f00 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
15f10 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
15f20 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
15f30 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
15f40 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
15f50 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
15f60 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15f70 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69  of a LIKE optimi
15f80 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e  zation range con
15f90 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74  straint.    ** t
15fa0 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77  o mix with a low
15fb0 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66  er range bound f
15fc0 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73  rom some other s
15fd0 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  ource */.    if(
15fe0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
15ff0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26  & TERM_LIKEOPT &
16000 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
16010 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74  or==WO_LT ) cont
16020 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
16030 20 6e 6f 74 20 61 6c 6c 6f 77 20 63 6f 6e 73 74   not allow const
16040 72 61 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  raints from the 
16050 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
16060 62 65 20 75 73 65 64 20 62 79 20 74 68 65 0a 20  be used by the. 
16070 20 20 20 2a 2a 20 72 69 67 68 74 20 74 61 62 6c     ** right tabl
16080 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
16090 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69  .  Only constrai
160a0 6e 74 73 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  nts in the ON cl
160b0 61 75 73 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  ause are.    ** 
160c0 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69  allowed */.    i
160d0 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69  f( (pSrc->fg.joi
160e0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
160f0 21 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  !=0.     && !Exp
16100 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
16110 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
16120 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20  omJoin).    ){. 
16130 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
16140 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49 73     }..    if( Is
16150 55 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f  UniqueIndex(pPro
16160 62 65 29 20 26 26 20 73 61 76 65 64 5f 6e 45 71  be) && saved_nEq
16170 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  ==pProbe->nKeyCo
16180 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 42 75  l-1 ){.      pBu
16190 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20  ilder->bldFlags 
161a0 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55  |= SQLITE_BLDF_U
161b0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
161c0 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
161d0 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
161e0 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45  LITE_BLDF_INDEXE
161f0 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  D;.    }.    pNe
16200 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
16210 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
16220 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
16230 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
16240 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16250 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
16260 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  tm;.    pNew->u.
16270 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76  btree.nTop = sav
16280 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65  ed_nTop;.    pNe
16290 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
162a0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
162b0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
162c0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
162d0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
162e0 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
162f0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
16300 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
16310 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
16320 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
16330 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
16340 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
16350 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
16360 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
16370 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
16380 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
16390 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
163a0 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
163b0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
163c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
163d0 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
163e0 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
163f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16400 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
16410 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
16420 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
16430 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
16440 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
16450 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
16460 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16470 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16480 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
16490 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
164a0 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
164b0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
164c0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
164d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 6e  int i;.        n
164e0 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  In = 46;  assert
164f0 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
16500 45 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20 20  Est(25) );..    
16510 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
16520 73 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c  ssion may actual
16530 6c 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ly be of the for
16540 6d 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45 4c  m (x, y) IN (SEL
16550 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20  ECT...)..       
16560 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
16570 20 74 68 65 72 65 20 69 73 20 61 20 73 65 70 61   there is a sepa
16580 72 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65 61  rate term for ea
16590 63 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28 79  ch of (x) and (y
165a0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  )..        ** Ho
165b0 77 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d  wever, the nIn m
165c0 75 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c 64  ultiplier should
165d0 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65 64   only be applied
165e0 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a   once, not once.
165f0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 65          ** for e
16600 61 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20 54  ach such term. T
16610 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
16620 70 20 63 68 65 63 6b 73 20 74 68 61 74 20 70 54  p checks that pT
16630 65 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20 20  erm is the.     
16640 20 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63 68     ** first such
16650 20 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e   term in use, an
16660 64 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b 20  d sets nIn back 
16670 74 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  to 0 if it is no
16680 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  t. */.        fo
16690 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e  r(i=0; i<pNew->n
166a0 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20  LTerm-1; i++){. 
166b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
166c0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20  w->aLTerm[i] && 
166d0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  pNew->aLTerm[i]-
166e0 3e 70 45 78 70 72 3d 3d 70 45 78 70 72 20 29 20  >pExpr==pExpr ) 
166f0 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nIn = 0;.       
16700 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
16710 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
16720 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
16730 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
16740 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
16750 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
16760 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
16770 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
16780 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
16790 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
167a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
167b0 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20  t( nIn>0 );  /* 
167c0 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32  RHS always has 2
167d0 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e   or more terms..
167e0 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20  .  The parser.  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67          ** chang
16810 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e  es "x IN (?)" in
16820 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20  to "x=?". */.   
16830 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16840 50 72 6f 62 65 2d 3e 68 61 73 53 74 61 74 31 20  Probe->hasStat1 
16850 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
16860 74 20 4d 2c 20 6c 6f 67 4b 2c 20 73 61 66 65 74  t M, logK, safet
16870 79 4d 61 72 67 69 6e 3b 0a 20 20 20 20 20 20 20  yMargin;.       
16880 20 2f 2a 20 4c 65 74 3a 0a 20 20 20 20 20 20 20   /* Let:.       
16890 20 2a 2a 20 20 20 4e 20 3d 20 74 68 65 20 74 6f   **   N = the to
168a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
168b0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  ws in the table.
168c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4b 20 3d          **   K =
168d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
168e0 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 52 48  ntries on the RH
168f0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16900 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ator.        ** 
16910 20 20 4d 20 3d 20 74 68 65 20 6e 75 6d 62 65 72    M = the number
16920 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
16930 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
16940 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 0a 20   terms to the . 
16950 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
16960 74 6f 20 74 68 65 20 6c 65 66 74 20 69 6e 20 74  to the left in t
16970 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20  he same index.  
16980 49 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  If the IN operat
16990 6f 72 20 69 73 20 6f 6e 0a 20 20 20 20 20 20 20  or is on.       
169a0 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 6c 65   **       the le
169b0 66 74 2d 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f  ft-most index co
169c0 6c 75 6d 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20  lumn, M==N..    
169d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
169e0 2a 20 47 69 76 65 6e 20 74 68 65 20 64 65 66 69  * Given the defi
169f0 6e 69 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20 69  nitions above, i
16a00 74 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 6f  t is better to o
16a10 6d 69 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  mit the IN opera
16a20 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  tor.        ** f
16a30 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 6c 6f  rom the index lo
16a40 6f 6b 75 70 20 61 6e 64 20 69 6e 73 74 65 61 64  okup and instead
16a50 20 64 6f 20 61 20 73 63 61 6e 20 6f 66 20 74 68   do a scan of th
16a60 65 20 4d 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20  e M elements,.  
16a70 20 20 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67        ** testing
16a80 20 65 61 63 68 20 73 63 61 6e 6e 65 64 20 72 6f   each scanned ro
16a90 77 20 61 67 61 69 6e 73 74 20 74 68 65 20 49 4e  w against the IN
16aa0 20 6f 70 65 72 61 74 6f 72 20 73 65 70 61 72 61   operator separa
16ab0 74 65 6c 79 2c 20 69 66 3a 0a 20 20 20 20 20 20  tely, if:.      
16ac0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16ad0 20 20 20 20 20 20 20 4d 2a 6c 6f 67 28 4b 29 20         M*log(K) 
16ae0 3c 20 4b 2a 6c 6f 67 28 4e 29 0a 20 20 20 20 20  < K*log(N).     
16af0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16b00 20 4f 75 72 20 65 73 74 69 6d 61 74 65 73 20 66   Our estimates f
16b10 6f 72 20 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d  or M, K, and N m
16b20 69 67 68 74 20 62 65 20 69 6e 61 63 63 75 72 61  ight be inaccura
16b30 74 65 2c 20 73 6f 20 77 65 20 62 75 69 6c 64 20  te, so we build 
16b40 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
16b50 73 61 66 65 74 79 20 6d 61 72 67 69 6e 20 6f 66  safety margin of
16b60 20 32 20 28 4c 6f 67 45 73 74 3a 20 31 30 29 20   2 (LogEst: 10) 
16b70 74 68 61 74 20 66 61 76 6f 72 73 20 75 73 69 6e  that favors usin
16b80 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
16b90 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  r.        ** wit
16ba0 68 20 74 68 65 20 69 6e 64 65 78 2c 20 61 73 20  h the index, as 
16bb0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 68  using an index h
16bc0 61 73 20 62 65 74 74 65 72 20 77 6f 72 73 74 2d  as better worst-
16bd0 63 61 73 65 20 62 65 68 61 76 69 6f 72 2e 0a 20  case behavior.. 
16be0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
16bf0 64 6f 20 6e 6f 74 20 68 61 76 65 20 72 65 61 6c  do not have real
16c00 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61   sqlite_stat1 da
16c10 74 61 2c 20 61 6c 77 61 79 73 20 70 72 65 66 65  ta, always prefe
16c20 72 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 20  r to use.       
16c30 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
16c40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16c50 20 20 4d 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69    M = pProbe->ai
16c60 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
16c70 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 6c 6f  nEq];.        lo
16c80 67 4b 20 3d 20 65 73 74 4c 6f 67 28 6e 49 6e 29  gK = estLog(nIn)
16c90 3b 0a 20 20 20 20 20 20 20 20 73 61 66 65 74 79  ;.        safety
16ca0 4d 61 72 67 69 6e 20 3d 20 31 30 3b 20 20 2f 2a  Margin = 10;  /*
16cb0 20 54 55 4e 49 4e 47 3a 20 65 78 74 72 61 20 77   TUNING: extra w
16cc0 65 69 67 68 74 20 66 6f 72 20 69 6e 64 65 78 65  eight for indexe
16cd0 64 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  d IN */.        
16ce0 69 66 28 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73  if( M + logK + s
16cf0 61 66 65 74 79 4d 61 72 67 69 6e 20 3c 20 6e 49  afetyMargin < nI
16d00 6e 20 2b 20 72 4c 6f 67 53 69 7a 65 20 29 7b 0a  n + rLogSize ){.
16d10 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
16d20 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20  RACE(0x40,.     
16d30 20 20 20 20 20 20 20 28 22 53 63 61 6e 20 70 72         ("Scan pr
16d40 65 66 65 72 72 65 64 20 6f 76 65 72 20 49 4e 20  eferred over IN 
16d50 6f 70 65 72 61 74 6f 72 20 6f 6e 20 63 6f 6c 75  operator on colu
16d60 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22 20  mn %d of \"%s\" 
16d70 28 25 64 3c 25 64 29 5c 6e 22 2c 0a 20 20 20 20  (%d<%d)\n",.    
16d80 20 20 20 20 20 20 20 20 20 73 61 76 65 64 5f 6e           saved_n
16d90 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  Eq, pProbe->zNam
16da0 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49  e, M+logK+10, nI
16db0 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20  n+rLogSize));.  
16dc0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
16dd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16de0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
16df0 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20  TRACE(0x40,.    
16e00 20 20 20 20 20 20 20 20 28 22 49 4e 20 6f 70 65          ("IN ope
16e10 72 61 74 6f 72 20 70 72 65 66 65 72 72 65 64 20  rator preferred 
16e20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20  on column %d of 
16e30 5c 22 25 73 5c 22 20 28 25 64 3e 3d 25 64 29 5c  \"%s\" (%d>=%d)\
16e40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16e50 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f   saved_nEq, pPro
16e60 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67  be->zName, M+log
16e70 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69  K+10, nIn+rLogSi
16e80 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ze));.        }.
16e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
16ea0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
16eb0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
16ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
16ed0 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
16ee0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
16ef0 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
16f00 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
16f10 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
16f20 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
16f30 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
16f40 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
16f50 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
16f60 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
16f70 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
16f80 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
16f90 6f 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d  ol>=0 && nInMul=
16fa0 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  =0 && saved_nEq=
16fb0 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
16fc0 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
16fd0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58       if( iCol==X
16fe0 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62  N_ROWID || pProb
16ff0 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a  e->uniqNotNull .
17000 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72           || (pPr
17010 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  obe->nKeyCol==1 
17020 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
17030 6f 72 20 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51  or && eOp==WO_EQ
17040 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
17050 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
17060 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
17070 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  NEROW;.        }
17080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17090 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
170a0 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45   WHERE_UNQ_WANTE
170b0 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
170c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
170d0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
170e0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
170f0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
17100 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
17110 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
17120 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
17130 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
17140 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
17150 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17160 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
17170 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
17180 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
17190 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
171a0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
171b0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
171c0 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61  e.nBtm = whereRa
171d0 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
171e0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
171f0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
17200 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
17210 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b  , pTerm.      );
17220 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
17230 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
17240 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
17250 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
17260 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
17270 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
17280 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
17290 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
172a0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
172b0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
172c0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
172d0 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
172e0 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
172f0 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
17300 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
17310 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
17320 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
17330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17340 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
17350 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
17360 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17370 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
17380 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
17390 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
173a0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
173b0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
173c0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
173d0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
173e0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
173f0 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
17400 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17410 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
17420 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
17430 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17440 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Top = 1;.      }
17450 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17460 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
17470 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
17480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17490 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
174a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
174b0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
174c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
174d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
174e0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
174f0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
17500 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
17510 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  op = whereRangeV
17520 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
17530 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
17540 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
17550 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
17560 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
17570 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
17580 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
17590 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
175a0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
175b0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
175c0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
175d0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
175e0 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
175f0 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
17600 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
17610 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
17620 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17630 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
17640 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
17650 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
17660 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
17670 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
17680 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
17690 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
176a0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
176b0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
176c0 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
176d0 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
176e0 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
176f0 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
17700 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
17710 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
17720 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
17730 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
17740 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
17750 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
17760 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
17770 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
17780 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
17790 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
177a0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
177b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
177c0 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
177d0 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
177e0 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
177f0 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
17800 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
17810 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
17820 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
17830 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
17840 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
17850 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
17860 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
17870 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
17880 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
17890 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
178a0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
178b0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
178c0 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a  O_IN|WO_IS) );..
178d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
178e0 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
178f0 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  nOut );.      if
17900 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
17910 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ob<=0 && pProbe-
17920 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
17930 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  nEq]>=0 ){.     
17940 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
17950 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
17960 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
17970 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17980 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
17990 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
179a0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
179b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
179c0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
179d0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
179e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
179f0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
17a00 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
17a10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
17a20 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
17a30 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
17a40 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
17a50 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
17a60 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
17a70 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
17a80 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
17a90 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
17aa0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
17ab0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
17ac0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
17ad0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
17ae0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
17af0 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20 20  LITE_Stat34).   
17b00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17b10 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17b20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
17b30 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
17b40 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
17b50 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29  ULL|WO_IS))!=0 )
17b60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
17b70 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17b80 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _EQ );.         
17b90 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17ba0 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
17bb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17bc0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
17bd0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L );.           
17be0 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
17bf0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
17c00 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
17c10 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
17c20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
17c40 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
17c50 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
17c60 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
17c70 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
17c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ca0 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
17cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17cd0 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
17ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
17cf0 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65  p out of the pTe
17d00 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  rm loop */.     
17d10 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
17d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
17d30 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
17d40 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20  3LogEst(nOut);. 
17d50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
17d60 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
17d70 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
17d80 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
17d90 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
17da0 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
17db0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17dc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17dd0 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69   nOut==0 ).#endi
17de0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
17df0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
17e00 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52   += (pProbe->aiR
17e10 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20  owLogEst[nEq] - 
17e20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
17e30 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20  Est[nEq-1]);.   
17e40 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
17e50 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
17e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
17e70 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
17e80 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   no likelihood()
17e90 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74   value, assume t
17ea0 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20  hat a .         
17eb0 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55     ** "col IS NU
17ec0 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  LL" expression m
17ed0 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20  atches twice as 
17ee0 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20  many rows .     
17ef0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f         ** as (co
17f00 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  l=?). */.       
17f10 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
17f20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  += 10;.         
17f30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17f40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17f50 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20  /* Set rCostIdx 
17f60 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  to the cost of v
17f70 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64  isiting selected
17f80 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20   rows in index. 
17f90 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  Add.    ** it to
17fa0 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69   pNew->rRun, whi
17fb0 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
17fc0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20  set to the cost 
17fd0 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
17fe0 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54   ** seek only. T
17ff0 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20  hen, if this is 
18000 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
18010 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f  ndex, add the co
18020 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73  st of.    ** vis
18030 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69  iting the rows i
18040 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
18050 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49  .  */.    rCostI
18060 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  dx = pNew->nOut 
18070 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
18080 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63  ->szIdxRow)/pSrc
18090 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  ->pTab->szTabRow
180a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
180b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
180c0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43  Add(rLogSize, rC
180d0 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28  ostIdx);.    if(
180e0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
180f0 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
18100 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
18110 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
18120 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
18130 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
18140 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  un, pNew->nOut +
18150 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   16);.    }.    
18160 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
18170 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
18180 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
18190 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20  costMult);..    
181a0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
181b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
181c0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
181d0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
181e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
181f0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
18200 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
18210 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
18220 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  >pWC, pNew, rSiz
18230 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  e);.    rc = whe
18240 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
18250 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20  ilder, pNew);.. 
18260 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
18270 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
18280 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
18290 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
182a0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
182b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
182c0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e  w->nOut = nOutUn
182d0 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a  adjusted;.    }.
182e0 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
182f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18300 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
18310 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
18320 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
18330 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  nColumn.    ){. 
18340 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
18350 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
18360 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
18370 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
18380 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
18390 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
183a0 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
183b0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
183c0 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
183d0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
183e0 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
183f0 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
18400 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
18410 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
18420 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
18430 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
18440 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73  u.btree.nBtm = s
18450 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65  aved_nBtm;.  pNe
18460 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
18470 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20  = saved_nTop;.  
18480 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
18490 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
184a0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
184b0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
184c0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
184d0 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
184e0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
184f0 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
18500 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
18510 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
18520 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
18530 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
18540 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
18550 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
18560 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
18570 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
18580 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
18590 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
185a0 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
185b0 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
185c0 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
185d0 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
185e0 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
185f0 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
18600 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
18610 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
18620 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
18630 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
18640 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
18650 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
18660 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
18670 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
18680 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
18690 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
186a0 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
186b0 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
186c0 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
186d0 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
186e0 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
186f0 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
18700 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
18710 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
18720 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
18730 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
18740 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
18750 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
18760 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
18770 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
18780 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
18790 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
187a0 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
187b0 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
187c0 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
187d0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
187e0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
187f0 20 53 51 4c 49 54 45 5f 53 6b 69 70 53 63 61 6e   SQLITE_SkipScan
18800 29 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  ).   && pProbe->
18810 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
18820 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
18830 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
18840 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
18850 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
18860 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
18870 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
18880 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
18890 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
188a0 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
188b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
188c0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
188d0 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
188e0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
188f0 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
18900 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
18910 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
18920 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
18930 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
18940 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
18950 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
18960 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
18970 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
18980 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
18990 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
189a0 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
189b0 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
189c0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
189d0 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
189e0 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
189f0 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
18a00 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
18a10 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
18a20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
18a30 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
18a40 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
18a50 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
18a60 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
18a70 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
18a80 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
18a90 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
18aa0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
18ab0 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
18ac0 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
18ad0 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
18ae0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
18af0 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
18b00 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
18b10 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64 42 74  , ("END %s.addBt
18b20 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d  reeIdx(%s), nEq=
18b30 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20  %d, rc=%d\n",.  
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62      pProbe->pTab
18b60 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f 62  le->zName, pProb
18b70 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f  e->zName, saved_
18b80 6e 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74  nEq, rc));.  ret
18b90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18ba0 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
18bb0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
18bc0 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
18bd0 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
18be0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
18bf0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18c00 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
18c10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
18c20 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
18c30 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
18c40 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
18c50 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
18c60 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
18c70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
18c80 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
18c90 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
18ca0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
18cb0 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
18cc0 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
18cd0 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
18ce0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
18cf0 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
18d00 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
18d10 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
18d20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74  *pOB;.  ExprList
18d30 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e   *aColExpr;.  in
18d40 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
18d50 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
18d60 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
18d70 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
18d80 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
18d90 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
18da0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
18db0 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
18dc0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
18dd0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
18de0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
18df0 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
18e00 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
18e10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
18e20 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
18e30 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
18e40 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18e50 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
18e60 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
18e70 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
18e80 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
18e90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
18ea0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
18eb0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
18ec0 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
18ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
18ee0 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d   if( (aColExpr =
18ef0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
18f00 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  r)!=0 ){.      f
18f10 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
18f20 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
18f30 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
18f40 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
18f50 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20  [jj]!=XN_EXPR ) 
18f60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
18f70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
18f80 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 78  rCompareSkip(pEx
18f90 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
18fa0 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
18fb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
18fc0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18fe0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18ff0 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20   0;.}../* Check 
19000 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74  to see if a part
19010 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70  ial index with p
19020 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63  PartIndexWhere c
19030 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e  an be used.** in
19040 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65   the current que
19050 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ry.  Return true
19060 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e   if it can be an
19070 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
19080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
19090 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
190a0 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20  Index(int iTab, 
190b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
190c0 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b  , Expr *pWhere){
190d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
190e0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
190f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
19100 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
19110 72 73 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  rse;.  while( pW
19120 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
19130 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65   ){.    if( !whe
19140 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19150 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57  ndex(iTab,pWC,pW
19160 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72  here->pLeft) ) r
19170 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68  eturn 0;.    pWh
19180 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52  ere = pWhere->pR
19190 69 67 68 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ight;.  }.  if( 
191a0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
191b0 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s & SQLITE_Enabl
191c0 65 51 50 53 47 20 29 20 70 50 61 72 73 65 20 3d  eQPSG ) pParse =
191d0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   0;.  for(i=0, p
191e0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
191f0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
19200 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
19210 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
19220 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
19230 28 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  ( (!ExprHasPrope
19240 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
19250 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72  omJoin) || pExpr
19260 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
19270 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 20 26 26  e==iTab).     &&
19280 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
19290 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
192a0 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
192b0 54 61 62 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  Tab) .    ){.   
192c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
192d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
192e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
192f0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
19300 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
19310 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
19320 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
19330 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74  able.** is ident
19340 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  ified by pBuilde
19350 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
19360 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
19370 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
19380 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
19390 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
193a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
193b0 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
193c0 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
193d0 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
193e0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
193f0 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
19400 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
19410 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
19420 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
19430 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
19440 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
19450 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
19460 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
19470 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
19480 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
19490 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
194a0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
194b0 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
194c0 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
194d0 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
194e0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
194f0 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
19510 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
19520 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
19530 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
19540 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
19550 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
19560 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
19570 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
19580 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
19590 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
195a0 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
195b0 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
195c0 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
195d0 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
195e0 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
195f0 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
19600 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
19610 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
19620 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
19630 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
19640 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
19650 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
19660 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
19670 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
19680 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
19690 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
196a0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
196b0 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
196c0 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
196d0 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
196e0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
196f0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
19700 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
19710 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
19720 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
19730 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
19740 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
19750 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
19760 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
19770 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
19780 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
19790 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
197a0 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
197b0 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
197c0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
197d0 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
197e0 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77  ted values (nRow
197f0 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29  , nVisit, nSeek)
19800 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61   often contain a
19810 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a   large amount.**
19820 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e   of uncertainty.
19830 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
19840 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65  n, scoring is de
19850 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70  signed to pick p
19860 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f  lans that.** "do
19870 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22   the least harm"
19880 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65   if the estimate
19890 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65  s are inaccurate
198a0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
198b0 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66  a.** log(nRow) f
198c0 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64  actor is omitted
198d0 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65   from a non-cove
198e0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
198f0 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62  in order to.** b
19900 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20  ias the scoring 
19910 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e  in favor of usin
19920 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63  g an index, sinc
19930 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  e the worst-case
19940 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
19950 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
19960 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20  x is far better 
19970 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63  than the worst-c
19980 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ase performance.
19990 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  ** of a full tab
199a0 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74  le scan..*/.stat
199b0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
199c0 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
199d0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
199e0 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
199f0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
19a00 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
19a10 20 6d 50 72 65 72 65 71 20 20 20 20 20 20 20 20   mPrereq        
19a20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
19a30 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
19a40 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
19a50 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
19a60 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
19a70 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
19a80 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
19a90 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
19aa0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
19ab0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
19ac0 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
19ad0 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19af0 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
19b00 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
19b10 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
19b20 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
19b30 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
19b40 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
19b50 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
19b60 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
19b70 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
19b80 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
19b90 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
19ba0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
19bb0 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
19bc0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
19bd0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
19be0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
19bf0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19c00 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
19c10 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
19c20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
19c30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
19c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19c50 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
19c60 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
19c70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19c80 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
19c90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
19ca0 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
19cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19cc0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
19cd0 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19cf0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
19d00 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
19d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19d20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
19d30 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
19d40 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
19d50 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
19d60 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
19d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
19d80 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
19d90 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
19da0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
19db0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
19dc0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
19dd0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19df0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
19e00 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
19e10 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
19e20 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
19e30 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
19e40 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
19e50 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
19e60 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
19e70 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
19e80 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
19e90 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
19ea0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
19eb0 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
19ec0 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
19ed0 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
19ee0 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  IBIndex ){.    /
19ef0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
19f00 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
19f10 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
19f20 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
19f30 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
19f40 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  >pIBIndex;.  }el
19f50 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
19f60 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
19f70 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
19f80 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
19f90 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
19fa0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
19fb0 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
19fc0 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
19fd0 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
19fe0 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
19ff0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
1a000 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1a010 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
1a020 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
1a030 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
1a040 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
1a050 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
1a060 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
1a070 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
1a080 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
1a090 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a0b0 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
1a0c0 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
1a0d0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
1a0e0 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
1a0f0 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
1a100 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
1a110 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
1a120 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
1a130 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
1a140 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
1a150 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
1a160 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
1a170 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
1a180 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
1a190 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
1a1a0 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
1a1b0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
1a1c0 20 20 20 20 73 50 6b 2e 69 64 78 54 79 70 65 20      sPk.idxType 
1a1d0 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
1a1e0 5f 49 50 4b 3b 0a 20 20 20 20 61 69 52 6f 77 45  _IPK;.    aiRowE
1a1f0 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e  stPk[0] = pTab->
1a200 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20  nRowLogEst;.    
1a210 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
1a220 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  0;.    pFirst = 
1a230 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
1a240 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
1a250 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
1a260 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1a270 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
1a280 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
1a290 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
1a2a0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
1a2b0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
1a2c0 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
1a2d0 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
1a2e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1a2f0 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
1a300 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
1a310 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d  robe = &sPk;.  }
1a320 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d  .  rSize = pTab-
1a330 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72  >nRowLogEst;.  r
1a340 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
1a350 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65  (rSize);..#ifnde
1a360 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a370 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
1a380 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
1a390 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
1a3a0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
1a3b0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74       /* Not part
1a3c0 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69   of an OR optimi
1a3d0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20  zation */.   && 
1a3e0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1a3f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
1a400 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
1a410 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
1a420 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1a430 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
1a440 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
1a450 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20 20  >pIBIndex==0    
1a460 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45    /* Has no INDE
1a470 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  XED BY clause */
1a480 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
1a490 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f 2a  .notIndexed   /*
1a4a0 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45   Has no NOT INDE
1a4b0 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  XED clause */.  
1a4c0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
1a4d0 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  b)         /* No
1a4e0 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  t WITHOUT ROWID 
1a4f0 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57  table. (FIXME: W
1a500 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26  hy not?) */.   &
1a510 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f  & !pSrc->fg.isCo
1a520 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20  rrelated /* Not 
1a530 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
1a540 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21  query */.   && !
1a550 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72  pSrc->fg.isRecur
1a560 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72  sive  /* Not a r
1a570 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20  ecursive common 
1a580 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
1a590 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  . */.  ){.    /*
1a5a0 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
1a5b0 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
1a5c0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1a5d0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
1a5e0 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
1a5f0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
1a600 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
1a610 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
1a620 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
1a630 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
1a640 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1a650 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1a660 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
1a670 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
1a680 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
1a690 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
1a6a0 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
1a6b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
1a6c0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
1a6d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70       pNew->nSkip
1a6e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
1a6f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
1a700 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
1a710 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1a720 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a730 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
1a740 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
1a750 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
1a760 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
1a770 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
1a780 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
1a790 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f   ** estimated to
1a7a0 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20   be X*N*log2(N) 
1a7b0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
1a7c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1a7d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1a7e0 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
1a7f0 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20  xed and where X 
1a800 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29  is 7 (LogEst=28)
1a810 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   for normal.    
1a820 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72      ** tables or
1a830 20 30 2e 35 20 28 4c 6f 67 45 73 74 3d 2d 31 30   0.5 (LogEst=-10
1a840 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  ) for views and 
1a850 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1a860 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
1a870 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65  * of X is smalle
1a880 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  r for views and 
1a890 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68  subqueries so th
1a8a0 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  at the query pla
1a8b0 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  nner.        ** 
1a8c0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67  will be more agg
1a8d0 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65  ressive about ge
1a8e0 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74  nerating automat
1a8f0 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20  ic indexes for. 
1a900 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20         ** those 
1a910 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74  objects, since t
1a920 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72  here is no oppor
1a930 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63  tunity to add sc
1a940 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  hema.        ** 
1a950 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75  indexes on subqu
1a960 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e  eries and views.
1a970 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1a980 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53  ->rSetup = rLogS
1a990 69 7a 65 20 2b 20 72 53 69 7a 65 3b 0a 20 20 20  ize + rSize;.   
1a9a0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
1a9b0 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
1a9c0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1a9d0 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
1a9e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1a9f0 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 38 3b  w->rSetup += 28;
1aa00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1aa10 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1aa20 72 53 65 74 75 70 20 2d 3d 20 31 30 3b 0a 20 20  rSetup -= 10;.  
1aa30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1aa40 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
1aa50 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
1aa60 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
1aa70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1aa80 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20  New->rSetup<0 ) 
1aa90 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1aaa0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
1aab0 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
1aac0 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
1aad0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1aae0 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
1aaf0 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
1ab00 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
1ab10 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
1ab20 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
1ab30 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
1ab40 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c   knowing how sel
1ab50 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
1ab60 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
1ab70 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
1ab80 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
1ab90 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
1aba0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
1abb0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
1abc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1abd0 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
1abe0 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
1abf0 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
1ac00 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1ac10 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1ac20 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
1ac30 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
1ac40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1ac50 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
1ac60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1ac70 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
1ac80 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
1ac90 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
1aca0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1acb0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1acc0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
1acd0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
1ace0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1acf0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
1ad00 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
1ad10 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 49 66 20  all indices. If 
1ad20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
1ad30 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1ad40 74 68 65 6e 20 6f 6e 6c 79 20 0a 20 20 2a 2a 20  then only .  ** 
1ad50 63 6f 6e 73 69 64 65 72 20 69 6e 64 65 78 20 70  consider index p
1ad60 50 72 6f 62 65 2e 20 20 2a 2f 0a 20 20 66 6f 72  Probe.  */.  for
1ad70 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
1ad80 20 26 26 20 70 50 72 6f 62 65 3b 20 0a 20 20 20   && pProbe; .   
1ad90 20 20 20 70 50 72 6f 62 65 3d 28 70 53 72 63 2d     pProbe=(pSrc-
1ada0 3e 70 49 42 49 6e 64 65 78 20 3f 20 30 20 3a 20  >pIBIndex ? 0 : 
1adb0 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 2c 20  pProbe->pNext), 
1adc0 69 53 6f 72 74 49 64 78 2b 2b 0a 20 20 29 7b 0a  iSortIdx++.  ){.
1add0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1ade0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
1adf0 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55  .     && !whereU
1ae00 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
1ae10 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  x(pSrc->iCursor,
1ae20 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
1ae30 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
1ae40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ae50 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63  pNew->iTab!=pSrc
1ae60 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a  ->iCursor );  /*
1ae70 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64   See ticket [98d
1ae80 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20  973b8f5] */.    
1ae90 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
1aea0 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
1aeb0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1aec0 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
1aed0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 72 6f    }.    if( pPro
1aee0 62 65 2d 3e 62 4e 6f 51 75 65 72 79 20 29 20 63  be->bNoQuery ) c
1aef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 53 69  ontinue;.    rSi
1af00 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
1af10 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
1af20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
1af30 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
1af40 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
1af50 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
1af60 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a  btree.nTop = 0;.
1af70 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
1af80 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
1af90 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
1afa0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1afb0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
1afc0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
1afd0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
1afe0 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  req;.    pNew->n
1aff0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
1b000 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
1b010 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a  Index = pProbe;.
1b020 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67      b = indexMig
1b030 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
1b040 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f  y(pBuilder, pPro
1b050 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  be, pSrc->iCurso
1b060 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f  r);.    /* The O
1b070 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66  NEPASS_DESIRED f
1b080 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72  lags never occur
1b090 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  s together with 
1b0a0 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
1b0b0 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d  assert( (pWInfo-
1b0c0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1b0d0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
1b0e0 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20  RED)==0 || b==0 
1b0f0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  );.    if( pProb
1b100 65 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49  e->idxType==SQLI
1b110 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b 20 29  TE_IDXTYPE_IPK )
1b120 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
1b130 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
1b140 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
1b150 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1b160 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
1b170 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
1b180 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
1b190 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
1b1a0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
1b1b0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b1c0 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
1b1d0 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
1b1e0 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
1b1f0 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
1b200 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
1b210 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
1b220 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
1b230 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1b240 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1b250 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1b260 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1b270 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b280 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1b290 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
1b2a0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
1b2b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1b2c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
1b2d0 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
1b2e0 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
1b2f0 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
1b300 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
1b310 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1b320 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
1b330 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
1b340 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
1b350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b360 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
1b370 64 20 26 20 70 50 72 6f 62 65 2d 3e 63 6f 6c 4e  d & pProbe->colN
1b380 6f 74 49 64 78 65 64 3b 0a 20 20 20 20 20 20 20  otIdxed;.       
1b390 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1b3a0 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
1b3b0 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
1b3c0 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
1b3d0 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
1b3e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  }..      /* Full
1b3f0 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
1b400 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20  */.      if( b. 
1b410 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77        || !HasRow
1b420 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20  id(pTab).       
1b430 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  || pProbe->pPart
1b440 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
1b450 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
1b460 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
1b470 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
1b480 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
1b490 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
1b4a0 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
1b4b0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
1b4c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1b4d0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
1b4e0 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
1b4f0 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
1b500 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
1b510 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
1b520 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
1b530 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
1b540 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
1b550 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
1b560 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
1b570 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
1b580 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
1b590 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
1b5a0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1b5b0 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
1b5c0 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
1b5d0 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
1b5e0 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
1b5f0 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
1b600 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
1b610 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
1b620 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
1b630 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
1b640 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ows. */.        
1b650 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
1b660 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ze + 1 + (15*pPr
1b670 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
1b680 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
1b690 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20         if( m!=0 
1b6a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b6b0 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  If this is a non
1b6c0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
1b6d0 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65  scan, add in the
1b6e0 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20   cost of.       
1b6f0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c     ** doing tabl
1b700 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20  e lookups.  The 
1b710 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20  cost will be 3x 
1b720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
1b730 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75          ** looku
1b740 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61  ps.  Take into a
1b750 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61  ccount WHERE cla
1b760 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 63  use terms that c
1b770 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  an be.          
1b780 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69  ** satisfied usi
1b790 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
1b7a0 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e  x, and that do n
1b7b0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20 20 20  ot require a.   
1b7c0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
1b7d0 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20  lookup. */.     
1b7e0 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f       LogEst nLoo
1b7f0 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36  kup = rSize + 16
1b800 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a  ;  /* Base cost:
1b810 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20    N*3 */.       
1b820 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1b830 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
1b840 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  pSrc->iCursor;. 
1b850 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c           WhereCl
1b860 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57  ause *pWC2 = &pW
1b870 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20  Info->sWC;.     
1b880 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1b890 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69  i<pWC2->nTerm; i
1b8a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1b8b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1b8c0 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69  rm = &pWC2->a[ii
1b8d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
1b8e0 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
1b8f0 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70 54  overedByIndex(pT
1b900 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72  erm->pExpr, iCur
1b910 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
1b920 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b930 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1b950 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c  Term can be eval
1b960 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74  uated using just
1b970 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20   the index.  So 
1b980 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20  reduce.         
1b990 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74     ** the expect
1b9a0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  ed number of tab
1b9b0 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72  le lookups accor
1b9c0 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20  dingly */.      
1b9d0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1b9e0 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
1b9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
1ba00 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d  Lookup += pTerm-
1ba10 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
1ba20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
1ba40 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20  okup--;.        
1ba50 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1ba60 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1ba70 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f  _EQ|WO_IS) ) nLo
1ba80 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20  okup -= 19;.    
1ba90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1baa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1bab0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1bac0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
1bad0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
1bae0 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20  Run, nLookup);. 
1baf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bb00 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
1bb10 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
1bb20 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
1bb30 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
1bb40 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
1bb50 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
1bb60 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1bb70 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
1bb80 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
1bb90 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1bba0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
1bbb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
1bbc0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1bbd0 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72   }..    pBuilder
1bbe0 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a  ->bldFlags = 0;.
1bbf0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1bc00 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
1bc10 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
1bc20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20  pProbe, 0);.    
1bc30 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c  if( pBuilder->bl
1bc40 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42  dFlags==SQLITE_B
1bc50 4c 44 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  LDF_INDEXED ){. 
1bc60 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e       /* If a non
1bc70 2d 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73  -unique index is
1bc80 20 75 73 65 64 2c 20 6f 72 20 69 66 20 61 20 70   used, or if a p
1bc90 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79  refix of the key
1bca0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e   for.      ** un
1bcb0 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73  ique index is us
1bcc0 65 64 20 28 6d 61 6b 69 6e 67 20 74 68 65 20 69  ed (making the i
1bcd0 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c  ndex functionall
1bce0 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20  y non-unique).  
1bcf0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1bd00 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74  sqlite_stat1 dat
1bd10 61 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74  a becomes import
1bd20 61 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e 67 20  ant for scoring 
1bd30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  the.      ** pla
1bd40 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  n */.      pTab-
1bd50 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
1bd60 53 74 61 74 73 55 73 65 64 3b 0a 20 20 20 20 7d  StatsUsed;.    }
1bd70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1bd80 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
1bd90 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
1bda0 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70  Stat4ProbeFree(p
1bdb0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a  Builder->pRec);.
1bdc0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
1bdd0 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  ecValid = 0;.   
1bde0 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
1bdf0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
1be00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1be10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1be20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1be30 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1be40 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c 72   pIdxInfo is alr
1be50 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77  eady populated w
1be60 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ith all constrai
1be70 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20  nts that may.** 
1be80 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 76  be used by the v
1be90 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64 65  irtual table ide
1bea0 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c  ntified by pBuil
1beb0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
1bec0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1bed0 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65 74  n marks a subset
1bee0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74 72   of those constr
1bef0 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69 6e  aints usable, in
1bf00 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42 65  vokes the.** xBe
1bf10 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61  stIndex method a
1bf20 6e 64 20 61 64 64 73 20 74 68 65 20 72 65 74 75  nd adds the retu
1bf30 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42 75  rned plan to pBu
1bf40 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  ilder..**.** A c
1bf50 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61 72  onstraint is mar
1bf60 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a  ked usable if:.*
1bf70 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e  *.**   * Argumen
1bf80 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63 61  t mUsable indica
1bf90 74 65 73 20 74 68 61 74 20 69 74 73 20 70 72 65  tes that its pre
1bfa0 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20 61  requisites are a
1bfb0 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a  vailable, and.**
1bfc0 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e 6f  .**   * It is no
1bfd0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  t one of the ope
1bfe0 72 61 74 6f 72 73 20 73 70 65 63 69 66 69 65 64  rators specified
1bff0 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64 65   in the mExclude
1c000 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20   mask passed.** 
1c010 20 20 20 20 61 73 20 74 68 65 20 66 6f 75 72 74      as the fourt
1c020 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69 63  h argument (whic
1c030 68 20 69 6e 20 70 72 61 63 74 69 63 65 20 69 73  h in practice is
1c040 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72   either WO_IN or
1c050 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   0)..**.** Argum
1c060 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20 61  ent mPrereq is a
1c070 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   mask of tables 
1c080 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c090 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a  nned before the.
1c0a0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1c0b0 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54 68   in question. Th
1c0c0 65 73 65 20 61 72 65 20 61 64 64 65 64 20 74 6f  ese are added to
1c0d0 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72 65   the plans prere
1c0e0 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f  quisites.** befo
1c0f0 72 65 20 69 74 20 69 73 20 61 64 64 65 64 20 74  re it is added t
1c100 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  o pBuilder..**.*
1c110 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
1c120 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74 20  er *pbIn is set 
1c130 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 70  to true if the p
1c140 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42 75  lan added to pBu
1c150 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e  ilder.** uses on
1c160 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20  e or more WO_IN 
1c170 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20  terms, or false 
1c180 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1c190 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1c1a0 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1c1b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1c1c0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
1c1d0 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
1c1e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c1f0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c   /* Mask of tabl
1c200 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1c210 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61  used. */.  Bitma
1c220 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20 20  sk mUsable,     
1c230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c240 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61 62  sk of usable tab
1c250 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78  les */.  u16 mEx
1c260 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20 20  clude,          
1c270 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 6c           /* Excl
1c280 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67 20  ude terms using 
1c290 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20  these operators 
1c2a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  */.  sqlite3_ind
1c2b0 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
1c2c0 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  o,   /* Populate
1c2d0 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42 65  d object for xBe
1c2e0 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  stIndex */.  u16
1c2f0 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20   mNoOmit,       
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c310 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73  Do not omit thes
1c320 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
1c330 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20  .  int *pbIn    
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
1c360 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20  if plan uses an 
1c370 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b  IN(...) op */.){
1c380 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1c390 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1c3a0 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71  pWC;.  struct sq
1c3b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1c3c0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
1c3d0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
1c3e0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1c3f0 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
1c400 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
1c410 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
1c420 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
1c430 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20  xTerm;.  int rc 
1c440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
1c450 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d  hereLoop *pNew =
1c460 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1c470 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c480 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1c490 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  nfo->pParse;.  s
1c4a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c4b0 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69  em *pSrc = &pBui
1c4c0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  lder->pWInfo->pT
1c4d0 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
1c4e0 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f  iTab];.  int nCo
1c4f0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
1c500 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
1c510 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55  ;..  assert( (mU
1c520 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29  sable & mPrereq)
1c530 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a  ==mPrereq );.  *
1c540 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77  pbIn = 0;.  pNew
1c550 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72  ->prereq = mPrer
1c560 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  eq;..  /* Set th
1c570 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e  e usable flag on
1c580 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 63   the subset of c
1c590 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74  onstraints ident
1c5a0 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61  ified by .  ** a
1c5b0 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65  rguments mUsable
1c5c0 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a   and mExclude. *
1c5d0 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
1c5e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
1c5f0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1c600 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
1c610 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
1c620 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1c630 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
1c640 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  ns++){.    Where
1c650 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
1c660 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e  WC->a[pIdxCons->
1c670 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20  iTermOffset];.  
1c680 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
1c690 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  le = 0;.    if( 
1c6a0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
1c6b0 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d  ght & mUsable)==
1c6c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1c6d0 68 74 20 0a 20 20 20 20 20 26 26 20 28 70 54 65  ht .     && (pTe
1c6e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c6f0 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20  mExclude)==0.   
1c700 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f   ){.      pIdxCo
1c710 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
1c720 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c730 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
1c740 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20  utput fields of 
1c750 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
1c760 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
1c770 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73   */.  memset(pUs
1c780 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
1c790 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74  Usage[0])*nConst
1c7a0 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74  raint);.  assert
1c7b0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
1c7c0 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20  ToFreeIdxStr==0 
1c7d0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  );.  pIdxInfo->i
1c7e0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
1c7f0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
1c800 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
1c810 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
1c820 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1c830 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
1c840 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
1c850 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49   (double)2;.  pI
1c860 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1c870 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49  dRows = 25;.  pI
1c880 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1c890 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1c8a0 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c  ->colUsed = (sql
1c8b0 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d  ite3_int64)pSrc-
1c8c0 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20  >colUsed;..  /* 
1c8d0 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75  Invoke the virtu
1c8e0 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e  al table xBestIn
1c8f0 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a  dex() method */.
1c900 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
1c910 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 53 72  ndex(pParse, pSr
1c920 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66  c->pTab, pIdxInf
1c930 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  o);.  if( rc ){.
1c940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c950 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
1c960 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1c970 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
1c980 6f 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  od returns SQLIT
1c990 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
1c9a0 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 20 20 2a  at means.      *
1c9b0 2a 20 74 68 61 74 20 74 68 65 20 70 61 72 74 69  * that the parti
1c9c0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
1c9d0 6e 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  n of parameters 
1c9e0 70 72 6f 76 69 64 65 64 20 69 73 20 75 6e 75 73  provided is unus
1c9f0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  able..      ** M
1ca00 61 6b 65 20 6e 6f 20 65 6e 74 72 69 65 73 20 69  ake no entries i
1ca10 6e 20 74 68 65 20 6c 6f 6f 70 20 74 61 62 6c 65  n the loop table
1ca20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ca30 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
1ca40 66 66 2c 20 28 22 20 20 5e 5e 5e 5e 2d 2d 2d 20  ff, ("  ^^^^--- 
1ca50 6e 6f 6e 2d 76 69 61 62 6c 65 20 70 6c 61 6e 20  non-viable plan 
1ca60 72 65 6a 65 63 74 65 64 21 5c 6e 22 29 29 3b 0a  rejected!\n"));.
1ca70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ca80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ca90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1caa0 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b  ..  mxTerm = -1;
1cab0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1cac0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
1cad0 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d  aint );.  for(i=
1cae0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1caf0 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
1cb00 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e  erm[i] = 0;.  pN
1cb10 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
1cb20 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43  ask = 0;.  pIdxC
1cb30 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
1cb40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1cb50 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
1cb60 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
1cb70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1cb80 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
1cb90 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
1cba0 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
1cbb0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
1cbc0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
1cbd0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
1cbe0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1cbf0 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  erm;.      int j
1cc00 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
1cc10 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
1cc20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
1cc30 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c  traint.       ||
1cc40 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a   j<0.       || j
1cc50 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
1cc60 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
1cc70 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
1cc80 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73       || pIdxCons
1cc90 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20  ->usable==0.    
1cca0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
1ccb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ccc0 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64  rse,"%s.xBestInd
1ccd0 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  ex malfunction",
1cce0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1ccf0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1cd00 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f 2d 3e  case( pIdxInfo->
1cd10 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1cd20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1cd30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cd40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1cd50 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1cd60 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
1cd70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cd80 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
1cd90 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
1cda0 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
1cdb0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
1cdc0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
1cdd0 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
1cde0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1cdf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
1ce00 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
1ce10 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
1ce20 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1ce30 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
1ce40 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
1ce50 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
1ce60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ce70 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
1ce80 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1ce90 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
1cea0 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
1ceb0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
1cec0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1ced0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
1cee0 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
1cef0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1cf00 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
1cf10 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1cf20 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1cf30 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1cf40 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1cf50 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
1cf60 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
1cf70 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
1cf80 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
1cf90 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
1cfa0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1cfb0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
1cfc0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
1cfd0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
1cfe0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
1cff0 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
1d000 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
1d010 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
1d020 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
1d030 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
1d040 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
1d050 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1d060 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
1d070 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
1d080 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
1d090 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1d0a0 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
1d0b0 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20  In = 1; assert( 
1d0c0 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49  (mExclude & WO_I
1d0d0 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  N)==0 );.      }
1d0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1d0f0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1d100 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a  sk &= ~mNoOmit;.
1d110 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1d120 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 66 6f  = mxTerm+1;.  fo
1d130 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 54 65 72 6d  r(i=0; i<=mxTerm
1d140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1d150 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  pNew->aLTerm[i]=
1d160 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1d170 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 61 72 67 76  he non-zero argv
1d180 49 64 78 20 76 61 6c 75 65 73 20 6d 75 73 74 20  Idx values must 
1d190 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 20 20  be contiguous.  
1d1a0 52 61 69 73 65 20 61 6e 0a 20 20 20 20 20 20 2a  Raise an.      *
1d1b0 2a 20 65 72 72 6f 72 20 69 66 20 74 68 65 79 20  * error if they 
1d1c0 61 72 65 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20  are not */.     
1d1d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d1e0 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73  (pParse,"%s.xBes
1d1f0 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
1d200 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e  on",pSrc->pTab->
1d210 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 74 65  zName);.      te
1d220 73 74 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f  stcase( pIdxInfo
1d230 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1d240 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
1d250 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1d260 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1d270 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
1d280 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
1d290 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  );.  pNew->u.vta
1d2a0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
1d2b0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 70  nfo->idxNum;.  p
1d2c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1d2d0 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
1d2e0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1d2f0 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  r;.  pIdxInfo->n
1d300 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1d310 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1d320 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
1d330 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
1d340 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
1d350 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
1d360 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1d370 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
1d380 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
1d390 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  rBy : 0);.  pNew
1d3a0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1d3b0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1d3c0 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f  ite3LogEstFromDo
1d3d0 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65  uble(pIdxInfo->e
1d3e0 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
1d3f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
1d400 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
1d410 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
1d420 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ows);..  /* Set 
1d430 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
1d440 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65   flag if the xBe
1d450 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64  stIndex() method
1d460 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a 20   indicated.  ** 
1d470 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
1d480 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73 74  ll visit at most
1d490 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72 20   one row. Clear 
1d4a0 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f  it otherwise. */
1d4b0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
1d4c0 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c 49  >idxFlags & SQLI
1d4d0 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
1d4e0 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65 77  IQUE ){.    pNew
1d4f0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
1d500 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c  RE_ONEROW;.  }el
1d510 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  se{.    pNew->ws
1d520 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
1d530 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 63  ONEROW;.  }.  rc
1d540 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1d550 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1d560 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  w);.  if( pNew->
1d570 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1d580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1d590 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
1d5a0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 4e  .idxStr);.    pN
1d5b0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1d5c0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 57  ree = 0;.  }.  W
1d5d0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
1d5e0 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72 65  , ("  bIn=%d pre
1d5f0 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72 65  reqIn=%04llx pre
1d600 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e 22  reqOut=%04llx\n"
1d610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d620 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20 28          *pbIn, (
1d630 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d  sqlite3_uint64)m
1d640 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  Prereq,.        
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1d660 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28 70  qlite3_uint64)(p
1d670 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1d680 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72 65  Prereq)));..  re
1d690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d6a0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
1d6b0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 72  on is invoked fr
1d6c0 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 78 42 65  om within an xBe
1d6d0 73 74 49 6e 64 65 78 28 29 20 63 61 6c 6c 62 61  stIndex() callba
1d6e0 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e  ck, it.** return
1d6f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1d700 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1d710 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
1d720 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  he collation.** 
1d730 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61  sequence associa
1d740 74 65 64 20 77 69 74 68 20 65 6c 65 6d 65 6e 74  ted with element
1d750 20 69 43 6f 6e 73 20 6f 66 20 74 68 65 20 73 71   iCons of the sq
1d760 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1d770 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  .aConstraint.** 
1d780 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 69 43  array. Or, if iC
1d790 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66 20 72 61  ons is out of ra
1d7a0 6e 67 65 20 6f 72 20 74 68 65 72 65 20 69 73 20  nge or there is 
1d7b0 6e 6f 20 61 63 74 69 76 65 20 78 42 65 73 74 49  no active xBestI
1d7c0 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65  ndex.** call, re
1d7d0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f  turn NULL..*/.co
1d7e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1d7f0 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e  3_vtab_collation
1d800 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
1d810 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 69  nfo *pIdxInfo, i
1d820 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20 48 69 64  nt iCons){.  Hid
1d830 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48  denIndexInfo *pH
1d840 69 64 64 65 6e 20 3d 20 28 48 69 64 64 65 6e 49  idden = (HiddenI
1d850 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78 49  ndexInfo*)&pIdxI
1d860 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  nfo[1];.  const 
1d870 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a  char *zRet = 0;.
1d880 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20 26    if( iCons>=0 &
1d890 26 20 69 43 6f 6e 73 3c 70 49 64 78 49 6e 66 6f  & iCons<pIdxInfo
1d8a0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  ->nConstraint ){
1d8b0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
1d8c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54   = 0;.    int iT
1d8d0 65 72 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  erm = pIdxInfo->
1d8e0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 43 6f 6e  aConstraint[iCon
1d8f0 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s].iTermOffset;.
1d900 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
1d910 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e 61 5b 69  Hidden->pWC->a[i
1d920 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20  Term].pExpr;.   
1d930 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 20 29   if( pX->pLeft )
1d940 7b 0a 20 20 20 20 20 20 70 43 20 3d 20 73 71 6c  {.      pC = sql
1d950 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
1d960 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64 65 6e  eCollSeq(pHidden
1d970 2d 3e 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  ->pParse, pX->pL
1d980 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
1d990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74  ;.    }.    zRet
1d9a0 20 3d 20 28 70 43 20 3f 20 70 43 2d 3e 7a 4e 61   = (pC ? pC->zNa
1d9b0 6d 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42  me : sqlite3StrB
1d9c0 49 4e 41 52 59 29 3b 0a 20 20 7d 0a 20 20 72 65  INARY);.  }.  re
1d9d0 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
1d9e0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
1d9f0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
1da00 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
1da10 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
1da20 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
1da30 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
1da40 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
1da50 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
1da60 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
1da70 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1da80 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53   no LEFT or CROS
1da90 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20  S JOIN joins in 
1daa0 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20  the query, both 
1dab0 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d  mPrereq and.** m
1dac0 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74  Unusable are set
1dad0 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65   to 0. Otherwise
1dae0 2c 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d  , mPrereq is a m
1daf0 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20  ask of all FROM 
1db00 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65  clause.** entrie
1db10 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
1db20 6f 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ore the virtual 
1db30 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1db40 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65  M clause and are
1db50 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72  .** separated fr
1db60 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
1db70 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52  t one LEFT or CR
1db80 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61  OSS JOIN. Simila
1db90 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75  rly, the.** mUnu
1dba0 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61  sable mask conta
1dbb0 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  ins all FROM cla
1dbc0 75 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  use entries that
1dbd0 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
1dbe0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1dbf0 65 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61  e and are separa
1dc00 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61  ted from it by a
1dc10 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54  t least one LEFT
1dc20 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f   or .** CROSS JO
1dc30 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  IN. .**.** For e
1dc40 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
1dc50 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a  uery were:.**.**
1dc60 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20     ... FROM t1, 
1dc70 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c  t2 LEFT JOIN t3,
1dc80 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f   t4, vt CROSS JO
1dc90 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a  IN t5, t6;.**.**
1dca0 20 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f   then mPrereq co
1dcb0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31  rresponds to (t1
1dcc0 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61  , t2) and mUnusa
1dcd0 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e  ble to (t5, t6).
1dce0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74  .**.** All the t
1dcf0 61 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71  ables in mPrereq
1dd00 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1dd10 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
1dd20 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20  ent virtual .** 
1dd30 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65  table. So any te
1dd40 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c  rms for which al
1dd50 6c 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  l prerequisites 
1dd60 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
1dd70 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79   .** mPrereq may
1dd80 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73   be specified as
1dd90 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c   "usable" in all
1dda0 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1ddb0 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72  ndex. .** Conver
1ddc0 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73  sely, all tables
1ddd0 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75   in mUnusable mu
1dde0 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66  st be scanned af
1ddf0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ter the current.
1de00 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1de10 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66  , so any terms f
1de20 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65  or which the pre
1de30 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c  requisites overl
1de40 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73  ap with.** mUnus
1de50 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61  able should alwa
1de60 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64  ys be configured
1de70 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22   as "not-usable"
1de80 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e   for xBestIndex.
1de90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1dea0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1deb0 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
1dec0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1ded0 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  ,  /* WHERE clau
1dee0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
1def0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  /.  Bitmask mPre
1df00 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
1df10 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
1df20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1df30 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20  before this one 
1df40 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  */.  Bitmask mUn
1df50 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20  usable          
1df60 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
1df70 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1df80 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20   after this one 
1df90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1dfa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1dfb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1dfc0 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ode */.  WhereIn
1dfd0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1dfe0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
1dff0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
1e000 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1e010 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1e020 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1e030 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1e040 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1e050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e060 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1e070 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1e080 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
1e090 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1e0a0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
1e0b0 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ch */.  sqlite3_
1e0c0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20  index_info *p;  
1e0d0 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
1e0e0 6f 20 70 61 73 73 20 74 6f 20 78 42 65 73 74 49  o pass to xBestI
1e0f0 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20  ndex() */.  int 
1e100 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1e110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e120 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1e130 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20  s in p */.  int 
1e140 62 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  bIn;            
1e150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e160 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e   if plan uses IN
1e170 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a  (...) operator *
1e180 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1e190 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  New;.  Bitmask m
1e1a0 42 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Best;           
1e1b0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73      /* Tables us
1e1c0 65 64 20 62 79 20 62 65 73 74 20 70 6f 73 73 69  ed by best possi
1e1d0 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31  ble plan */.  u1
1e1e0 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73  6 mNoOmit;..  as
1e1f0 73 65 72 74 28 20 28 6d 50 72 65 72 65 71 20 26  sert( (mPrereq &
1e200 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29   mUnusable)==0 )
1e210 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
1e220 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1e230 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
1e240 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 57 43 20  ->pParse;.  pWC 
1e250 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
1e260 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1e270 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
1e280 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
1e290 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
1e2a0 61 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 49  ab];.  assert( I
1e2b0 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70  sVirtual(pSrc->p
1e2c0 54 61 62 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c  Tab) );.  p = al
1e2d0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
1e2e0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e  pParse, pWC, mUn
1e2f0 75 73 61 62 6c 65 2c 20 70 53 72 63 2c 20 70 42  usable, pSrc, pB
1e300 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79  uilder->pOrderBy
1e310 2c 20 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d 69  , .      &mNoOmi
1e320 74 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  t);.  if( p==0 )
1e330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e340 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65  OMEM_BKPT;.  pNe
1e350 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1e360 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1e370 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1e380 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
1e390 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
1e3a0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1e3b0 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61   = 0;.  nConstra
1e3c0 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72  int = p->nConstr
1e3d0 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
1e3e0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72  eLoopResize(pPar
1e3f0 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43  se->db, pNew, nC
1e400 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20  onstraint) ){.  
1e410 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e420 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1e430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e440 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1e450 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61  }..  /* First ca
1e460 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  ll xBestIndex() 
1e470 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
1e480 69 6e 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a  ints usable. */.
1e490 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1e4a0 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e 61  00, ("BEGIN %s.a
1e4b0 64 64 56 69 72 74 75 61 6c 28 29 5c 6e 22 2c 20  ddVirtual()\n", 
1e4c0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1e4d0 65 29 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  e));.  WHERETRAC
1e4e0 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1e4f0 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1e500 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  le\n"));.  rc = 
1e510 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1e520 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1e530 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1e540 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  S, 0, p, mNoOmit
1e550 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49  , &bIn);..  /* I
1e560 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42  f the call to xB
1e570 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1e580 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65  all terms enable
1e590 64 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61  d produced a pla
1e5a0 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73  n.  ** that does
1e5b0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
1e5c0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28   source tables (
1e5d0 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68  IOW: a plan with
1e5e0 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a   mBest==0),.  **
1e5f0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
1e600 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e  o point in makin
1e610 67 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61  g any further ca
1e620 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1e630 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  x() .  ** since 
1e640 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65  they will all re
1e650 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65  turn the same re
1e660 73 75 6c 74 20 28 69 66 20 74 68 65 20 78 42 65  sult (if the xBe
1e670 73 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69  stIndex().  ** i
1e680 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
1e690 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28   sane). */.  if(
1e6a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e6b0 26 20 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77  & (mBest = (pNew
1e6c0 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1e6d0 72 65 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  req))!=0 ){.    
1e6e0 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30  int seenZero = 0
1e6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e700 20 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20   True if a plan 
1e710 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1e720 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  seen */.    int 
1e730 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30  seenZeroNoIN = 0
1e740 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;         /* Pla
1e750 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1e760 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29  s and no IN(...)
1e770 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74   seen */.    Bit
1e780 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a  mask mPrev = 0;.
1e790 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73      Bitmask mBes
1e7a0 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  tNoIn = 0;..    
1e7b0 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70  /* If the plan p
1e7c0 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65  roduced by the e
1e7d0 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73  arlier call uses
1e7e0 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d   an IN(...) term
1e7f0 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42  , call.    ** xB
1e800 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20  estIndex again, 
1e810 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49  this time with I
1e820 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73  N(...) terms dis
1e830 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  abled. */.    if
1e840 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57  ( bIn ){.      W
1e850 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1e860 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1e870 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49  all usable w/o I
1e880 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1e890 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1e8a0 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1e8b0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1e8c0 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1e8d0 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d   WO_IN, p, mNoOm
1e8e0 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1e8f0 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20   assert( bIn==0 
1e900 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f  );.      mBestNo
1e910 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  In = pNew->prere
1e920 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20  q & ~mPrereq;.  
1e930 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49      if( mBestNoI
1e940 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1e950 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1e960 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f        seenZeroNo
1e970 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1e980 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1e990 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1e9a0 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1e9b0 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1e9c0 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1e9d0 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69  rereq) .    ** i
1e9e0 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72  n the set of ter
1e9f0 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f  ms that apply to
1ea00 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1ea10 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tual table.  */.
1ea20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
1ea30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42    int i;.      B
1ea50 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41  itmask mNext = A
1ea60 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73  LLBITS;.      as
1ea70 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b  sert( mNext>0 );
1ea80 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ea90 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1eaa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
1eab0 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20  mask mThis = (. 
1eac0 20 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e             pWC->
1ead0 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  a[p->aConstraint
1eae0 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d  [i].iTermOffset]
1eaf0 2e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  .prereqRight & ~
1eb00 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20  mPrereq.        
1eb10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1eb20 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54  This>mPrev && mT
1eb30 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78  his<mNext ) mNex
1eb40 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20  t = mThis;.     
1eb50 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d   }.      mPrev =
1eb60 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66   mNext;.      if
1eb70 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53  ( mNext==ALLBITS
1eb80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1eb90 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74  if( mNext==mBest
1eba0 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74   || mNext==mBest
1ebb0 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NoIn ) continue;
1ebc0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1ebd0 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1ebe0 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30  ualOne: mPrev=%0
1ebf0 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c  4llx mNext=%04ll
1ec00 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1ec20 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72  lite3_uint64)mPr
1ec30 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  ev, (sqlite3_uin
1ec40 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20  t64)mNext));.   
1ec50 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1ec60 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1ec70 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1ec80 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65  er, mPrereq, mNe
1ec90 78 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  xt|mPrereq, 0, p
1eca0 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1ecb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1ecc0 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65  ->prereq==mPrere
1ecd0 71 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  q ){.        see
1ece0 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  nZero = 1;.     
1ecf0 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1ed00 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1ed10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ed20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
1ed30 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1ed40 65 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76  ex() in the abov
1ed50 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66  e loop did not f
1ed60 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a  ind a plan.    *
1ed70 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  * that requires 
1ed80 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  no source tables
1ed90 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e   at all (i.e. on
1eda0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1edb0 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  be.    ** usable
1edc0 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68  ), make a call h
1edd0 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75  ere with all sou
1ede0 72 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62  rce tables disab
1edf0 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  led */.    if( r
1ee00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ee10 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20  seenZero==0 ){. 
1ee20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1ee30 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1ee40 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c  lOne: all disabl
1ee50 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  ed\n"));.      r
1ee60 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1ee70 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1ee80 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1ee90 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71  mPrereq, mPrereq
1eea0 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1eeb0 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1eec0 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a  ( bIn==0 ) seenZ
1eed0 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1eee0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1eef0 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1ef00 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20  Index() have so 
1ef10 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69  far failed to fi
1ef20 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1ef30 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1ef40 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1ef50 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20  at all and does 
1ef60 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e  not use an IN(..
1ef70 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .).    ** operat
1ef80 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c  or, make a final
1ef90 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20   call to obtain 
1efa0 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  one here.  */.  
1efb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1efc0 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e  _OK && seenZeroN
1efd0 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIN==0 ){.      
1efe0 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1eff0 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1f000 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e   all disabled an
1f010 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  d w/o IN\n"));. 
1f020 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1f030 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1f040 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1f050 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1f060 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70  Prereq, WO_IN, p
1f070 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1f080 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1f090 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  f( p->needToFree
1f0a0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
1f0b0 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29  _free(p->idxStr)
1f0c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f0d0 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eNN(pParse->db, 
1f0e0 70 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  p);.  WHERETRACE
1f0f0 28 30 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73  (0x800, ("END %s
1f100 2e 61 64 64 56 69 72 74 75 61 6c 28 29 2c 20 72  .addVirtual(), r
1f110 63 3d 25 64 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  c=%d\n", pSrc->p
1f120 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 72 63 29 29  Tab->zName, rc))
1f130 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f140 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f150 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1f160 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
1f170 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
1f180 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
1f190 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
1f1a0 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
1f1b0 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
1f1c0 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
1f1d0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1f1e0 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72  oopAddOr(.  Wher
1f1f0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
1f200 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61  uilder, .  Bitma
1f210 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20 20 42  sk mPrereq, .  B
1f220 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1f230 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
1f240 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1f250 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68  er->pWInfo;.  Wh
1f260 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
1f270 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1f280 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  w;.  WhereTerm *
1f290 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a  pTerm, *pWCEnd;.
1f2a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f2b0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72  E_OK;.  int iCur
1f2c0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1f2d0 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  tempWC;.  WhereL
1f2e0 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42  oopBuilder sSubB
1f2f0 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53  uild;.  WhereOrS
1f300 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20  et sSum, sCur;. 
1f310 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f320 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
1f330 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
1f340 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20  ->pWC;.  pWCEnd 
1f350 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
1f360 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20  nTerm;.  pNew = 
1f370 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1f380 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20    memset(&sSum, 
1f390 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29  0, sizeof(sSum))
1f3a0 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
1f3b0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
1f3c0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
1f3d0 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
1f3e0 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54  ursor;..  for(pT
1f3f0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
1f400 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
1f410 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
1f420 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
1f430 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1f440 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
1f450 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
1f460 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
1f470 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
1f480 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
1f490 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1f4a0 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
1f4b0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1f4c0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
1f4d0 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
1f4e0 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
1f4f0 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
1f500 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1f510 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
1f520 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
1f530 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
1f540 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42      .      sSubB
1f550 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
1f560 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1f570 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
1f580 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1f590 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
1f5a0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1f5b0 45 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e  E(0x200, ("Begin
1f5c0 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
1f5d0 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
1f5e0 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  rm));.      for(
1f5f0 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
1f600 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45  ; pOrTerm<pOrWCE
1f610 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  nd; pOrTerm++){.
1f620 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
1f630 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1f640 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
1f650 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
1f660 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  ild.pWC = &pOrTe
1f670 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
1f680 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  wc;.        }els
1f690 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
1f6a0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1f6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  ){.          tem
1f6c0 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43  pWC.pWInfo = pWC
1f6d0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20  ->pWInfo;.      
1f6e0 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65      tempWC.pOute
1f6f0 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
1f700 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
1f710 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
1f720 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
1f730 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  1;.          tem
1f740 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
1f750 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
1f760 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70  uild.pWC = &temp
1f770 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  WC;.        }els
1f780 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
1f790 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1f7a0 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20  .        sCur.n 
1f7b0 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52  = 0;.#ifdef WHER
1f7c0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
1f7d0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
1f7e0 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65  E(0x200, ("OR-te
1f7f0 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20  rm %d of %p has 
1f800 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c  %d subterms:\n",
1f810 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f820 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65       (int)(pOrTe
1f830 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54  rm-pOrWC->a), pT
1f840 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70  erm, sSubBuild.p
1f850 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20  WC->nTerm));.   
1f860 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1f870 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34  WhereTrace & 0x4
1f880 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
1f890 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
1f8a0 73 65 50 72 69 6e 74 28 73 53 75 62 42 75 69 6c  sePrint(sSubBuil
1f8b0 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 20 20  d.pWC);.        
1f8c0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
1f8d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1f8e0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1f8f0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1f900 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
1f910 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1f920 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1f930 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  al(&sSubBuild, m
1f940 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
1f950 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
1f960 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
1f970 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
1f980 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1f990 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ree(&sSubBuild, 
1f9a0 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 20 20  mPrereq);.      
1f9b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1f9c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f9d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f9e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26  whereLoopAddOr(&
1f9f0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1fa00 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1fa10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fa20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1fa30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
1fa40 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
1fa50 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
1fa60 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
1fa70 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1fa80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1fa90 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
1faa0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
1fab0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
1fac0 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
1fad0 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
1fae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1faf0 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73      WhereOrSet s
1fb00 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
1fb10 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
1fb20 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
1fb30 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1fb40 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1fb50 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
1fb60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1fb70 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
1fb80 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
1fb90 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
1fba0 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
1fbb0 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
1fbc0 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
1fbd0 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1fc00 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
1fc10 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
1fc20 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1fc40 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1fc50 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
1fc60 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
1fc70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1fc80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1fca0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
1fcb0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
1fcc0 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
1fcd0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
1fce0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1fcf0 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
1fd00 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1fd10 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
1fd20 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
1fd30 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
1fd40 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
1fd50 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
1fd60 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
1fd70 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
1fd80 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
1fd90 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72    /* TUNING: Cur
1fda0 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d  rently sSum.a[i]
1fdb0 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20  .rRun is set to 
1fdc0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63  the sum of the c
1fdd0 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  osts.        ** 
1fde0 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73  of all sub-scans
1fdf0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1fe00 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65   OR-scan. Howeve
1fe10 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69  r, due to roundi
1fe20 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  ng.        ** er
1fe30 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20  rors, it may be 
1fe40 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
1fe50 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20   the OR-scan is 
1fe60 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20  equal to its.   
1fe70 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70       ** most exp
1fe80 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e  ensive sub-scan.
1fe90 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73   Add the smalles
1fea0 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c  t possible penal
1feb0 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ty .        ** (
1fec0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75  equivalent to mu
1fed0 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f  ltiplying the co
1fee0 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65  st by 1.07) to e
1fef0 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20  nsure that .    
1ff00 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73      ** this does
1ff10 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68   not happen. Oth
1ff20 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52  erwise, for WHER
1ff30 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61  E clauses such a
1ff40 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1ff50 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65   following where
1ff60 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
1ff70 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20  ex on "y":.     
1ff80 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1ff90 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c       WHERE likel
1ffa0 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29  ihood(x=?, 0.99)
1ffb0 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20   OR y=?.        
1ffc0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
1ffd0 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c  e planner may el
1ffe0 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65  ect to "OR" toge
1fff0 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c  ther a full-tabl
20000 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20  e scan and an.  
20010 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c        ** index l
20020 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72  ookup. And other
20030 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72   similarly odd r
20040 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
20050 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
20060 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
20070 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  + 1;.        pNe
20080 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
20090 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
200a0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
200b0 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
200c0 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
200d0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
200e0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
200f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
20100 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
20110 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e   ("End processin
20120 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
20130 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
20140 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
20160 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
20170 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
20180 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
20190 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
201a0 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
201b0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
201c0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
201d0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
201e0 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
201f0 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a  sk mPrereq = 0;.
20200 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
20210 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
20220 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
20230 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
20240 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
20250 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20260 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74  *pItem;.  struct
20270 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20280 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  End = &pTabList-
20290 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
202a0 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l];.  sqlite3 *d
202b0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
202c0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63  se->db;.  int rc
202d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
202e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
202f0 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74  .  u8 priorJoint
20300 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c  ype = 0;..  /* L
20310 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
20320 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
20330 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
20340 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ght */.  pNew = 
20350 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
20360 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
20370 70 4e 65 77 29 3b 0a 20 20 70 42 75 69 6c 64 65  pNew);.  pBuilde
20380 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 20 3d 20  r->iPlanLimit = 
20390 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41  SQLITE_QUERY_PLA
203a0 4e 4e 45 52 5f 4c 49 4d 49 54 3b 0a 20 20 66 6f  NNER_LIMIT;.  fo
203b0 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
203c0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
203d0 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
203e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
203f0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
20400 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
20410 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
20420 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e   pBuilder->iPlan
20430 4c 69 6d 69 74 20 2b 3d 20 53 51 4c 49 54 45 5f  Limit += SQLITE_
20440 51 55 45 52 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49  QUERY_PLANNER_LI
20450 4d 49 54 5f 49 4e 43 52 3b 0a 20 20 20 20 70 4e  MIT_INCR;.    pN
20460 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
20470 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
20480 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
20490 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
204a0 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
204b0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
204c0 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
204d0 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
204e0 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
204f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
20500 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
20510 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
20520 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
20530 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
20540 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
20550 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
20560 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
20570 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
20580 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
20590 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
205a0 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
205b0 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ype;.#ifndef SQL
205c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
205d0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
205e0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
205f0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74  Tab) ){.      st
20600 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20610 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  m *p;.      for(
20620 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70  p=&pItem[1]; p<p
20630 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
20640 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65     if( mUnusable
20650 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74   || (p->fg.joint
20660 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
20670 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20  T_CROSS)) ){.   
20680 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65         mUnusable
20690 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
206a0 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
206b0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43  >sMaskSet, p->iC
206c0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
206d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
206e0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
206f0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
20700 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  r, mPrereq, mUnu
20710 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
20720 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
20730 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
20740 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  ABLE */.    {.  
20750 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
20760 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
20770 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
20780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
20790 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 42  =SQLITE_OK && pB
207a0 75 69 6c 64 65 72 2d 3e 70 57 43 2d 3e 68 61 73  uilder->pWC->has
207b0 4f 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Or ){.      rc =
207c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
207d0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
207e0 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
207f0 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
20800 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
20810 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
20820 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20830 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  d ){.      if( r
20840 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
20850 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
20860 68 69 74 20 74 68 65 20 71 75 65 72 79 20 70 6c  hit the query pl
20870 61 6e 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d  anner search lim
20880 69 74 20 73 65 74 20 62 79 20 69 50 6c 61 6e 4c  it set by iPlanL
20890 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  imit */.        
208a0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
208b0 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 61 62 62  TE_WARNING, "abb
208c0 72 65 76 69 61 74 65 64 20 71 75 65 72 79 20 61  reviated query a
208d0 6c 67 6f 72 69 74 68 6d 20 73 65 61 72 63 68 22  lgorithm search"
208e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
208f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
20900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20910 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
20920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 65 72     }.  }..  wher
20930 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
20940 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
20950 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
20960 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
20970 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
20980 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
20990 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
209a0 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   6th.** paramete
209b0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
209c0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
209d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
209e0 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
209f0 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
20a00 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
20a10 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
20a20 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
20a30 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
20a40 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
20a50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20a60 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
20a70 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
20a80 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
20a90 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
20aa0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
20ab0 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
20ac0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
20ad0 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
20ae0 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
20af0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
20b00 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
20b10 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
20b20 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
20b30 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
20b40 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
20b50 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20b60 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
20b70 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
20b80 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
20b90 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
20ba0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
20bb0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
20bc0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
20bd0 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
20be0 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
20bf0 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
20c00 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
20c10 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
20c20 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
20c30 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
20c40 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
20c50 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20c60 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
20c70 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
20c80 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
20c90 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
20ca0 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
20cb0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
20cc0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
20cd0 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
20ce0 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
20cf0 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
20d00 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
20d10 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
20d20 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
20d30 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
20d40 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
20d50 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
20d60 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
20d70 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
20d80 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
20d90 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
20da0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
20db0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
20dc0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
20dd0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
20de0 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
20df0 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59  Y or _DISTINCTBY
20e00 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d   or _ORDERBY_LIM
20e10 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  IT */.  u16 nLoo
20e20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
20e30 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
20e40 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
20e50 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
20e60 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
20e70 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
20e80 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
20e90 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
20ea0 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
20eb0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
20ec0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
20ed0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
20ee0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
20ef0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
20f00 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
20f10 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
20f20 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
20f30 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
20f40 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
20f50 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
20f60 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
20f70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
20f80 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
20f90 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
20fa0 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
20fb0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
20fc0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
20fd0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
20fe0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
20ff0 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
21000 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
21010 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
21020 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
21030 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
21040 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
21050 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
21060 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65  lause */.  u16 e
21070 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  qOpMask;        
21080 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61   /* Allowed equa
21090 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
210a0 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
210b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
210c0 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
210d0 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
210e0 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
210f0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
21100 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
21110 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
21120 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
21130 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
21140 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
21150 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
21160 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
21170 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
21180 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
21190 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
211a0 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
211b0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
211c0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
211d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
211e0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
211f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
21200 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
21210 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
21220 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
21230 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
21240 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
21250 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
21260 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
21270 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
21280 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
21290 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
212a0 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
212b0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
212c0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
212d0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
212e0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
212f0 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
21300 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
21310 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
21320 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
21330 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
21340 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
21350 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
21360 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
21370 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
21380 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
21390 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
213a0 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
213b0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
213c0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
213d0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
213e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
213f0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
21400 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
21410 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
21420 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
21430 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
21440 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
21450 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
21460 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
21470 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
21480 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
21490 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
214a0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
214b0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
214c0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
214d0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
214e0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
214f0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
21500 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
21510 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
21520 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
21530 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
21540 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
21550 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
21560 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
21570 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
21580 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
21590 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
215a0 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
215b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
215c0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
215d0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
215e0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
215f0 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
21600 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
21610 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
21620 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
21630 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
21640 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
21650 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
21660 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
21670 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
21680 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
21690 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
216a0 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
216b0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
216c0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
216d0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
216e0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
216f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
21700 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
21710 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
21720 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
21730 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
21740 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
21750 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
21760 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
21770 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
21780 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
21790 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
217a0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
217b0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
217c0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
217d0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
217e0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
217f0 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
21800 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
21810 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
21820 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
21830 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
21840 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
21850 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
21860 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
21870 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
21880 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
21890 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
218a0 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
218b0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
218c0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
218d0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
218e0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
218f0 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
21900 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
21910 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
21920 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
21930 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
21940 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
21950 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
21960 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
21970 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
21980 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
21990 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
219a0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
219b0 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
219c0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
219d0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
219e0 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
219f0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
21a00 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
21a10 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
21a20 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
21a30 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
21a40 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
21a50 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
21a60 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
21a70 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
21a80 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
21a90 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
21aa0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
21ab0 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
21ac0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
21ad0 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
21ae0 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20  0;.  eqOpMask = 
21af0 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20  WO_EQ | WO_IS | 
21b00 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28  WO_ISNULL;.  if(
21b10 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21b20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21b30 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20  T ) eqOpMask |= 
21b40 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f  WO_IN;.  for(iLo
21b50 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
21b60 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
21b70 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
21b80 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
21b90 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
21ba0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
21bb0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
21bc0 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70   if( iLoop<nLoop
21bd0 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20   ){.      pLoop 
21be0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
21bf0 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28  Loop];.      if(
21c00 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21c10 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21c20 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
21c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21c40 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Loop = pLast;.  
21c50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
21c60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21c70 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
21c80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
21c90 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
21ca0 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
21cb0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
21cc0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
21cd0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
21ce0 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b  ree.nIdxCol = 0;
21cf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
21d00 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
21d10 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
21d20 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
21d30 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
21d40 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
21d50 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
21d60 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
21d70 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
21d80 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
21d90 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
21da0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
21db0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
21dc0 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
21dd0 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
21de0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
21df0 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
21e00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
21e10 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
21e20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21e30 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21e40 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
21e50 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
21e60 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
21e70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
21e80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21e90 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21ea0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
21eb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21ec0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
21ed0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
21ee0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
21ef0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
21f00 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  reFindTerm(&pWIn
21f10 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
21f20 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
21f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f40 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
21f50 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20  eqOpMask, 0);.  
21f60 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
21f70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21f80 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
21f90 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
21fa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  {.        /* IN 
21fb0 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76  terms are only v
21fc0 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  alid for sorting
21fd0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
21fe0 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20   LIMIT .        
21ff0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
22000 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69   and then only i
22010 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75 61  f they are actua
22020 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20 20  lly used.       
22030 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72 79   ** by the query
22040 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   plan */.       
22050 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
22060 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
22070 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  RBY_LIMIT );.   
22080 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22090 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  pLoop->nLTerm &&
220a0 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61   pTerm!=pLoop->a
220b0 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d  LTerm[j]; j++){}
220c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  .        if( j>=
220d0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20  pLoop->nLTerm ) 
220e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
220f0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  }.      if( (pTe
22100 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
22110 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
22120 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
22130 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
22140 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22150 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70 57  rCollSeqMatch(pW
22160 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a 20  Info->pParse, . 
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
22190 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70 45  pExpr, pTerm->pE
221a0 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)==0 ){.     
221b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
221c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
221d0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
221e0 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
221f0 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
22200 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
22210 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
22220 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
22230 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22240 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
22250 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
22260 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
22270 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
22280 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
22290 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
222a0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
222b0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
222c0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
222d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
222e0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
222f0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
22300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22310 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
22320 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
22330 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
22340 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
22350 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
22360 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
22370 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
22380 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
22390 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
223a0 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
223b0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
223c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
223d0 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20  n-1]==XN_ROWID. 
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73           || !Has
22400 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
22410 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
22420 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22430 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
22440 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
22450 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
22460 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
22470 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
22480 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
22490 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
224a0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
224b0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
224c0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
224d0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
224e0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
224f0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
22500 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
22510 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
22520 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
22530 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65  nce = 1; /* True
22540 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
22550 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
22560 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73   */..        ass
22570 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75  ert( j>=pLoop->u
22580 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20  .btree.nEq .    
22590 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
225a0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29  p->aLTerm[j]==0)
225b0 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ==(j<pLoop->nSki
225c0 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  p).        );.  
225d0 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
225e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26  p->u.btree.nEq &
225f0 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  & j>=pLoop->nSki
22600 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
22610 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  16 eOp = pLoop->
22620 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
22630 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  ator;..         
22640 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
22650 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55   and IS and ISNU
22660 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f  LL terms.  (Also
22670 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77   skip IN terms w
22680 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
22690 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44   doing WHERE_ORD
226a0 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65  ERBY_LIMIT proce
226b0 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20  ssing). .       
226c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
226d0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
226e0 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75  t term is a colu
226f0 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20  mn of an ((?,?) 
22700 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20  IN (SELECT...)) 
22710 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
22720 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69  pression for whi
22730 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ch the SELECT re
22740 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
22750 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20  one column,.    
22760 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74        ** check t
22770 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e  hat it is the on
22780 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62  ly column used b
22790 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68  y this loop. Oth
227a0 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
227b0 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e    ** if it is on
227c0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
227d0 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  , none of the co
227e0 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20  lumns can be.   
227f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64         ** consid
22800 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e  ered to match an
22810 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20   ORDER BY term. 
22820 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22830 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73  ( (eOp & eqOpMas
22840 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
22850 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
22860 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
22870 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22880 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
22890 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
228a0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
228b0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
228c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
228d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
228e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
228f0 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26  if( ALWAYS(eOp &
22900 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20   WO_IN) ){.     
22910 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53         /* ALWAYS
22920 28 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  () justification
22930 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61  : eOp is an equa
22940 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75  lity operator du
22950 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
22960 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d       ** j<pLoop-
22970 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e  >u.btree.nEq con
22980 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20  straint above.  
22990 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68  Any equality oth
229a0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
229b0 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20  * than WO_IN is 
229c0 63 61 70 74 75 72 65 64 20 62 79 20 74 68 65 20  captured by the 
229d0 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20  previous "if".  
229e0 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20  So this one.    
229f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
22a00 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49  s has to be WO_I
22a10 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  N. */.          
22a20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f    Expr *pX = pLo
22a30 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70  op->aLTerm[j]->p
22a40 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22a50 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70    for(i=j+1; i<p
22a60 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
22a70 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; i++){.       
22a80 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70         if( pLoop
22a90 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
22aa0 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20  pr==pX ){.      
22ab0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22ac0 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ( (pLoop->aLTerm
22ad0 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  [i]->eOperator &
22ae0 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20   WO_IN) );.     
22af0 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65             bOnce
22b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22b20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22b30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22b50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
22b60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
22b70 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
22b80 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
22b90 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
22ba0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
22bb0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
22bc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
22bd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22be0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
22bf0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
22c00 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
22c10 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
22c20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
22c30 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
22c40 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
22c50 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
22c60 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
22c70 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52  ) iColumn = XN_R
22c80 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  OWID;.        }e
22c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
22ca0 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
22cb0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  D;.          rev
22cc0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
22cd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
22ce0 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
22cf0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
22d00 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
22d10 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
22d20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
22d30 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
22d40 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
22d50 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
22d60 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
22d70 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
22d80 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
22d90 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
22da0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
22db0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
22dc0 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
22dd0 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
22de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
22df0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
22e00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
22e10 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
22e20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
22e30 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
22e40 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
22e50 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
22e60 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d   the index and m
22e70 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
22e80 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
22e90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
22ea0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
22eb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
22ec0 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
22ed0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
22ee0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
22ef0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
22f00 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
22f10 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
22f20 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
22f30 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
22f40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
22f50 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
22f60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
22f70 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
22f80 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
22f90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22fa0 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
22fb0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
22fc0 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
22fd0 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
22fe0 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
22ff0 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
23000 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
23010 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20  n>=XN_ROWID ){. 
23020 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23030 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
23040 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
23050 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23060 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
23070 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
23080 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
23090 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
230a0 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
230b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
230c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
230d0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 49 64         Expr *pId
230e0 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  xExpr = pIndex->
230f0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
23100 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
23110 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
23120 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 4f 42  rCompareSkip(pOB
23130 45 78 70 72 2c 20 70 49 64 78 45 78 70 72 2c 20  Expr, pIdxExpr, 
23140 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
23150 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23160 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23170 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23180 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
23190 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  !=XN_ROWID ){.  
231a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
231b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
231c0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
231d0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
231e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
231f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
23200 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
23210 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
23220 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
23230 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23250 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
23260 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b  e.nIdxCol = j+1;
23270 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
23280 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
23290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
232a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
232b0 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c  sMatch && (wctrl
232c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
232d0 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
232e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
232f0 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
23300 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
23310 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
23320 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
23330 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
23340 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
23350 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
23360 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
23370 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
23380 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23390 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
233a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
233b0 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
233c0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
233d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
233e0 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
233f0 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
23400 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
23410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
23420 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
23430 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
23440 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
23450 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
23460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23470 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
23480 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
23490 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  if( iColumn==XN_
234a0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
234b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
234c0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
234d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
234e0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
234f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23500 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
23510 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
23520 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
23540 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
23550 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
23560 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
23570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
23580 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
23590 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
235a0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
235b0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
235c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
235d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
235e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
235f0 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
23600 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
23610 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
23620 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
23630 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23640 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
23650 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
23660 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
23670 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
23680 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
23690 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
236a0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
236b0 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
236c0 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
236d0 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
236e0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
236f0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
23700 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
23710 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
23720 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
23730 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
23740 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
23750 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
23760 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
23770 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
23780 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
23790 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
237a0 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
237b0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
237c0 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69      mTerm = sqli
237d0 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
237e0 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
237f0 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
23800 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
23810 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
23820 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
23830 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23840 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
23850 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
23860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
23870 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
23880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23890 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
238a0 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
238b0 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
238c0 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
238d0 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
238e0 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
238f0 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
23900 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
23910 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
23920 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
23930 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
23940 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
23950 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
23960 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
23970 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
23980 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
23990 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
239a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
239b0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
239c0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
239d0 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
239e0 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
239f0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
23a00 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
23a10 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
23a20 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
23a30 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
23a40 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
23a50 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
23a60 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
23a70 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
23a80 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
23a90 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
23aa0 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
23ab0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
23ac0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
23ad0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
23ae0 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
23af0 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
23b00 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
23b10 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
23b20 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
23b30 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
23b40 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
23b50 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
23b60 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
23b70 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
23b80 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
23b90 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
23ba0 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
23bb0 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
23bc0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23bd0 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
23be0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
23bf0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
23c00 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
23c10 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
23c20 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
23c30 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
23c40 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
23c50 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
23c60 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
23c70 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
23c80 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
23c90 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
23ca0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
23cb0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
23cc0 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
23cd0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
23ce0 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
23cf0 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
23d00 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
23d10 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
23d20 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
23d30 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
23d40 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
23d50 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
23d60 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
23d70 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
23d80 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
23d90 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
23da0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23db0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
23dc0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
23dd0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23de0 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
23df0 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
23e00 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
23e10 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
23e20 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
23e30 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
23e40 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23e50 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
23e60 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
23e70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
23e80 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
23e90 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
23ea0 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
23eb0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23ec0 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
23ed0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
23ee0 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
23ef0 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
23f00 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
23f10 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
23f20 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
23f30 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
23f40 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
23f50 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
23f60 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
23f70 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
23f80 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
23f90 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
23fa0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
23fb0 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
23fc0 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
23fd0 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
23fe0 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
23ff0 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
24000 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
24010 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
24020 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
24030 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
24040 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
24050 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
24060 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
24070 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
24080 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
24090 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
240a0 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
240b0 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
240c0 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
240d0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
240e0 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
240f0 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
24100 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
24110 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
24120 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
24130 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
24140 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
24150 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
24160 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
24170 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
24180 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
24190 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
241a0 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
241b0 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
241c0 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
241d0 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
241e0 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
241f0 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
24200 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
24210 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
24220 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
24230 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
24240 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
24250 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
24260 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
24270 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
24280 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
24290 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  w + rScale + 16;
242a0 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20  ..  /* Multiple 
242b0 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20  by log(M) where 
242c0 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  M is the number 
242d0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a  of output rows..
242e0 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d    ** Use the LIM
242f0 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69  IT for M if it i
24300 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  s smaller */.  i
24310 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
24320 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
24330 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20  SE_LIMIT)!=0 && 
24340 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e  pWInfo->iLimit<n
24350 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20  Row ){.    nRow 
24360 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  = pWInfo->iLimit
24370 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73  ;.  }.  rSortCos
24380 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77  t += estLog(nRow
24390 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72  );.  return rSor
243a0 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tCost;.}../*.** 
243b0 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
243c0 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
243d0 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
243e0 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
243f0 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
24400 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
24410 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
24420 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
24430 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
24440 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
24450 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
24460 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
24470 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
24480 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
24490 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
244a0 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
244b0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
244c0 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
244d0 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
244e0 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
244f0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
24500 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
24510 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
24520 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
24530 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
24540 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
24550 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
24560 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
24570 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
24580 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
24590 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
245a0 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
245b0 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
245c0 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
245d0 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
245e0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
245f0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
24600 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
24610 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
24620 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
24630 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24640 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
24650 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
24660 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
24670 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24680 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
24690 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
246a0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
246b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
246c0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
246e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
246f0 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
24700 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
24710 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
24720 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
24730 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
24740 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
24750 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24760 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
24770 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  o replace */.  i
24780 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
24790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
247a0 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63  er of ORDER BY c
247b0 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  lause terms */. 
247c0 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
247d0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
247e0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
247f0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
24800 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72    LogEst mxUnsor
24810 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  ted = 0;    /* M
24820 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20  aximum unsorted 
24830 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
24840 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
24850 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
24860 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24870 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
24880 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
24890 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
248a0 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
248b0 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
248c0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
248d0 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
248e0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
248f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
24900 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
24910 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
24920 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
24930 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
24940 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
24950 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
24960 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
24970 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
24980 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
24990 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
249a0 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
249b0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
249c0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
249d0 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
249e0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
249f0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24a00 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
24a10 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
24a20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
24a30 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
24a40 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  emory */.  LogEs
24a50 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30  t *aSortCost = 0
24a60 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20  ;    /* Sorting 
24a70 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74  and partial sort
24a80 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63  ing costs */.  c
24a90 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
24aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
24ab0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
24ac0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
24ad0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
24ae0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24af0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
24b00 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  ce allocated at 
24b10 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61  pSpace */..  pPa
24b20 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
24b30 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
24b40 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
24b50 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
24b60 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
24b70 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
24b80 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
24b90 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
24ba0 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
24bb0 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
24bc0 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
24bd0 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
24be0 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
24bf0 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
24c00 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
24c10 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
24c20 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f  e = (nLoop<=1) ?
24c30 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
24c40 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
24c50 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
24c60 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
24c70 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
24c80 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
24c90 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28  begin solver.  (
24ca0 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20  nRowEst=%d)\n", 
24cb0 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a  nRowEst));..  /*
24cc0 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a   If nRowEst is z
24cd0 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73  ero and there is
24ce0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
24cf0 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20  use, ignore it. 
24d00 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73  In this.  ** cas
24d10 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  e the purpose of
24d20 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
24d30 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
24d40 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
24d50 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  urned.  ** by th
24d60 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e  e overall query.
24d70 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d   Once this estim
24d80 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ate has been obt
24d90 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  ained, the calle
24da0 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f  r.  ** will invo
24db0 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
24dc0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20   a second time, 
24dd0 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69  passing the esti
24de0 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  mate as the.  **
24df0 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74   nRowEst paramet
24e00 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  er.  */.  if( pW
24e10 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
24e20 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
24e30 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  ){.    nOrderBy 
24e40 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24e50 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49    nOrderBy = pWI
24e60 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
24e70 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
24e80 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
24e90 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
24ea0 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64  r aTo, aFrom and
24eb0 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a   aSortCost[] */.
24ec0 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65    nSpace = (size
24ed0 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69  of(WherePath)+si
24ee0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
24ef0 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65  *nLoop)*mxChoice
24f00 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20  *2;.  nSpace += 
24f10 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
24f20 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70   nOrderBy;.  pSp
24f30 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
24f40 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
24f50 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
24f60 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
24f70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24f80 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  PT;.  aTo = (Whe
24f90 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
24fa0 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
24fb0 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
24fc0 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
24fd0 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
24fe0 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
24ff0 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
25000 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
25010 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
25020 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
25030 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
25040 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
25050 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
25060 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  }.  if( nOrderBy
25070 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
25080 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
25090 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74  BY clause and it
250a0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67   is not being ig
250b0 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20  nored, set up.  
250c0 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
250d0 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61  he aSortCost[] a
250e0 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65  rray. Each eleme
250f0 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43  nt of the aSortC
25100 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  ost array.    **
25110 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20   is either zero 
25120 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73  - meaning it has
25130 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e   not yet been in
25140 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74  itialized - or t
25150 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
25160 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73  f sorting nRowEs
25170 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77  t rows of data w
25180 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58  here the first X
25190 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a   terms of.    **
251a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
251b0 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  ause are already
251c0 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65   in order, where
251d0 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20   X is the array 
251e0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
251f0 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74  */.    aSortCost
25200 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a   = (LogEst*)pX;.
25210 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74      memset(aSort
25220 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
25230 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
25240 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  By);.  }.  asser
25250 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20  t( aSortCost==0 
25260 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
25270 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72  e]==(char*)&aSor
25280 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20  tCost[nOrderBy] 
25290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f  );.  assert( aSo
252a0 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53  rtCost!=0 || &pS
252b0 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
252c0 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a  har*)pX );..  /*
252d0 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
252e0 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
252f0 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
25300 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
25310 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
25320 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
25330 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
25340 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
25350 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20  ove 28.  If the 
25360 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
25370 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
25380 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
25390 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
253a0 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20  n the first 28. 
253b0 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
253c0 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
253d0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
253e0 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
253f0 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
25400 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b  nQueryLoop, 48);
25410 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71    assert( 48==sq
25420 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20  lite3LogEst(28) 
25430 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
25440 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b    assert( aFrom[
25450 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20  0].isOrdered==0 
25460 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
25470 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  y ){.    /* If n
25480 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68  Loop is zero, th
25490 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
254a0 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68  FROM terms in th
254b0 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20  e query. Since. 
254c0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
254d0 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79  se the query may
254e0 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
254f0 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68  m of one row, th
25500 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a  e results.    **
25510 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
25520 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72  the requested or
25530 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72  der. Set isOrder
25540 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74  ed to nOrderBy t
25550 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74  o.    ** indicat
25560 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e  e this. Or, if n
25570 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  Loop is greater 
25580 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69  than zero, set i
25590 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20  sOrdered to.    
255a0 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  ** -1, indicatin
255b0 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  g that the resul
255c0 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79  t set may or may
255d0 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c   not be ordered,
255e0 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69   .    ** dependi
255f0 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20  ng on the loops 
25600 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  added to the cur
25610 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20  rent plan.  */. 
25620 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
25630 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20  dered = nLoop>0 
25640 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b  ? -1 : nOrderBy;
25650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
25660 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20  te successively 
25670 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68  longer WherePath
25680 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76  s using the prev
25690 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a  ious generation.
256a0 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74    ** of WherePat
256b0 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20  hs as the basis 
256c0 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b  for the next.  K
256d0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
256e0 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62   mxChoice.  ** b
256f0 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63  est paths at eac
25700 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  h generation */.
25710 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
25720 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
25730 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20  p++){.    nTo = 
25740 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  0;.    for(ii=0,
25750 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69   pFrom=aFrom; ii
25760 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46  <nFrom; ii++, pF
25770 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  rom++){.      fo
25780 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d  r(pWLoop=pWInfo-
25790 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b  >pLoops; pWLoop;
257a0 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e   pWLoop=pWLoop->
257b0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
257c0 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b      LogEst nOut;
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69        /* Rows vi
257f0 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b  sited by (pFrom+
25800 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
25810 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b     LogEst rCost;
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
25840 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  path (pFrom+pWLo
25850 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
25860 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b  ogEst rUnsorted;
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73   /* Unsorted cos
25890 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  t of (pFrom+pWLo
258a0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  op) */.        i
258b0 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
258c0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20  rom->isOrdered; 
258d0 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f   /* isOrdered fo
258e0 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  r (pFrom+pWLoop)
258f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
25900 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20  ask maskNew;    
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25920 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73   Mask of src vis
25930 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a  ited by (..) */.
25940 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
25950 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  revMask = 0;    
25960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
25970 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c  k of rev-order l
25980 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f  oops for (..) */
25990 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ..        if( (p
259a0 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
259b0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
259c0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
259d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
259e0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
259f0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
25a00 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
25a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25a20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25a30 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
25a40 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e  )!=0 && pFrom->n
25a50 52 6f 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20  Row<3 ){.       
25a60 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65     /* Do not use
25a70 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
25a80 64 65 78 20 69 66 20 74 68 65 20 74 68 69 73 20  dex if the this 
25a90 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74 65 64  loop is expected
25aa0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
25ab0 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31   run less than 1
25ac0 2e 32 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69  .25 times.  It i
25ad0 73 20 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c  s tempting to al
25ae0 73 6f 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20  so exclude.     
25af0 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
25b00 63 20 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e  c index usage on
25b10 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20   an outer loop, 
25b20 62 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e  but sometimes an
25b30 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20   automatic.     
25b40 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73       ** index is
25b50 20 75 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f   useful in the o
25b60 75 74 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63  uter loop of a c
25b70 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
25b80 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ry. */.         
25b90 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
25ba0 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
25bb0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
25bc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nue;.        }..
25bd0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
25be0 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
25bf0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
25c00 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
25c10 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
25c20 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
25c30 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
25c40 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
25c50 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
25c60 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
25c70 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
25c80 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
25c90 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
25ca0 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
25cb0 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
25cc0 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
25cd0 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
25ce0 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
25cf0 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
25d00 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
25d10 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
25d20 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
25d30 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
25d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
25d50 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
25d60 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
25d70 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
25da0 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
25db0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
25dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25dd0 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
25de0 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
25df0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25e00 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
25e10 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
25e20 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
25e30 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
25e40 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
25e50 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
25e60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
25e70 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
25e80 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
25e90 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
25ea0 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
25eb0 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25ed0 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
25ee0 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
25ef0 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
25f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
25f20 4e 47 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c  NG:  Add a small
25f30 20 65 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28   extra penalty (
25f40 35 29 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73  5) to sorting as
25f50 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   an.          **
25f60 20 65 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d   extra encouragm
25f70 65 6e 74 20 74 6f 20 74 68 65 20 71 75 65 72 79  ent to the query
25f80 20 70 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65   planner to sele
25f90 63 74 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20  ct a plan.      
25fa0 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
25fb0 20 72 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20   rows emerge in 
25fc0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
25fd0 72 20 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f  r without any so
25fe0 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rting.          
25ff0 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ** required. */.
26000 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
26010 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
26020 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
26030 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
26040 64 5d 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20  d]) + 5;..      
26050 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
26060 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
26070 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
26080 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
26090 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
260a0 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
260b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
260c0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
260d0 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
260e0 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
260f0 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
26100 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
26110 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
26120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26130 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
26140 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  rted;.          
26150 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20  rUnsorted -= 2; 
26160 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69   /* TUNING:  Sli
26170 67 68 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f  ght bias in favo
26180 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61  r of no-sort pla
26190 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ns */.        }.
261a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
261b0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
261c0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
261d0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
261e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
261f0 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
26200 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
26210 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
26220 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
26230 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
26240 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
26250 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
26260 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
26270 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
26280 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
26290 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
262a0 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
262b0 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
262c0 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
262d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
262e0 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
262f0 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
26300 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
26310 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
26320 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
26330 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
26340 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
26350 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
26360 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
26370 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
26380 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
26390 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
263a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
263b0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
263c0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
263d0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
263e0 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
263f0 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
26400 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
26410 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
26420 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
26430 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
26440 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
26450 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
26460 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
26470 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
26480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26490 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
264a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
264b0 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
264c0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
264d0 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
264e0 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
264f0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
26500 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
26510 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
26520 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
26530 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
26540 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
26550 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
26560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26570 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
26580 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
26590 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
265a0 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
265b0 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
265c0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
265d0 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
265e0 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
265f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
26600 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
26610 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
26620 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
26630 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
26640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26650 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
26660 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
26670 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26680 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
26690 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
266a0 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
266b0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
266c0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
266d0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
266e0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
266f0 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
26700 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
26710 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
26720 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
26730 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
26740 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
26750 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
26760 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
26780 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
26790 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
267a0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
267b0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
267c0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
267d0 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
267e0 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
267f0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
26800 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
26810 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
26820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26830 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
26840 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
26850 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
26860 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
26870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26880 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
26890 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
268a0 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
268b0 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
268c0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
268d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
268e0 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
268f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26900 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
26910 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
26920 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
26930 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
26940 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26950 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
26960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
26970 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
26980 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
26990 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
269a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
269b0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
269c0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
269d0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
269e0 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
269f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a00 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
26a10 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
26a20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
26a30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26a50 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
26a60 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
26a70 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
26a80 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
26a90 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
26aa0 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
26ab0 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
26ac0 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73  same isOrdered s
26ad0 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
26ae0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
26af0 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
26b00 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
26b10 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
26b20 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
26b30 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
26b40 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
26b50 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e  ould be skipped.
26b60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
26b70 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
26b80 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61  conditional is a
26b90 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f  n expanded vecto
26ba0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75  r comparison equ
26bb0 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20  ivalent to:.    
26bc0 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d        **   (pTo-
26bd0 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77  >rCost,pTo->nRow
26be0 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29  ,pTo->rUnsorted)
26bf0 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c   <= (rCost,nOut,
26c00 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20  rUnsorted).     
26c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26c20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
26c30 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  <rCost .        
26c40 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73     || (pTo->rCos
26c50 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20  t==rCost.       
26c60 20 20 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d          && (pTo-
26c70 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20  >nRow<nOut.     
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
26c90 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75   (pTo->nRow==nOu
26ca0 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
26cb0 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a  ted<=rUnsorted).
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20    ).            
26ce0 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b    ).          ){
26cf0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
26d00 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26d10 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
26d20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26d30 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
26d40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26d50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
26d80 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26d90 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
26da0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26db0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
26dc0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
26dd0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
26de0 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
26df0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
26e00 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
26e10 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26e30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26e40 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
26e50 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
26e60 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
26e70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26e80 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
26e90 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
26ea0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
26eb0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
26ec0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
26ed0 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65  ted, pTo->isOrde
26ee0 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
26ef0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26f00 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26f10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26f20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20       /* Discard 
26f30 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
26f40 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  th from further 
26f50 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
26f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26f70 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
26f80 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
26f90 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26fb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26fc0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
26fd0 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
26fe0 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
26ff0 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68  aches here if th
27000 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
27010 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
27020 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
27030 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c   pTo path.  Repl
27040 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65  ace pTo with the
27050 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23   candidate. */.#
27060 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
27070 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
27080 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
27090 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
270a0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
270b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
270c0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
270d0 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
270e0 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
270f0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
27100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27110 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
27120 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
27130 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
27140 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
27160 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
27170 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
27180 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
27190 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
271a0 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
271b0 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
271c0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
271d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
271e0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
271f0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
27200 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
27210 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
27220 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
27230 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
27240 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
27250 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
27260 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
27270 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
27280 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
27290 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
272a0 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
272b0 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
272c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
272d0 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
272e0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
272f0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
27300 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
27310 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
27320 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
27330 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
27340 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
27350 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
27360 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
27370 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
27380 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
27390 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
273a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
273b0 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
273c0 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
273d0 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
273e0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
273f0 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
27400 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
27410 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
27420 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
27430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
27440 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
27450 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
27460 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
27470 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
27480 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
27490 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
274a0 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
274b0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
274c0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
274d0 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
274e0 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
274f0 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
27500 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
27510 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
27520 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
27530 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
27540 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
27550 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
27560 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
27570 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
27580 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
27590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
275a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
275b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
275c0 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
275d0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
275e0 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
275f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
27600 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
27610 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27620 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
27630 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
27640 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
27650 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
27660 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
27670 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
27680 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27690 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
276a0 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
276b0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
276c0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
276d0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
276e0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
276f0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
27700 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
27710 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
27720 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
27730 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
27740 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
27750 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
27760 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27770 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
27780 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
27790 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
277a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
277b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
277c0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
277d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
277e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
277f0 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
27800 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
27810 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
27820 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
27830 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
27840 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
27850 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
27860 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
27870 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
27880 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
27890 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
278a0 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
278b0 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
278c0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
278d0 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
278e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
278f0 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
27900 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
27910 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
27920 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
27930 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
27940 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
27950 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
27960 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
27970 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
27980 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
27990 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
279a0 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
279b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
279c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
279d0 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
279e0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
279f0 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
27a00 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
27a10 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
27a20 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
27a30 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
27a40 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
27a50 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
27a60 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
27a70 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
27a80 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
27a90 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
27aa0 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
27ab0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
27ac0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
27ad0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
27ae0 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
27af0 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
27b00 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
27b10 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
27b20 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
27b30 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27b40 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
27b50 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
27b60 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
27b70 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
27b80 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
27b90 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
27ba0 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
27bb0 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
27bc0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
27bd0 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
27be0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
27bf0 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
27c00 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
27c10 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
27c20 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
27c30 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
27c40 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
27c50 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
27c60 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
27c70 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
27c80 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
27c90 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
27ca0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
27cb0 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
27cc0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  Loop = 0;.  if( 
27cd0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
27ce0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
27cf0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27d00 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
27d10 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
27d20 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
27d30 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
27d40 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
27d50 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
27d60 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
27d70 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
27d80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
27d90 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
27da0 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
27db0 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
27dc0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
27dd0 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
27de0 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  op;.      if( pW
27df0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20  Info->nOBSat<=0 
27e00 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
27e10 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
27e20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70         if( nLoop
27e30 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
27e40 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46  u32 wsFlags = pF
27e50 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
27e60 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  -1]->wsFlags;.  
27e70 20 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46          if( (wsF
27e80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
27e90 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  ROW)==0 .       
27ea0 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26      && (wsFlags&
27eb0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
27ec0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57  _COLUMN_IN))!=(W
27ed0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43  HERE_IPK|WHERE_C
27ee0 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20  OLUMN_IN).      
27ef0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
27f00 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30     Bitmask m = 0
27f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
27f20 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
27f30 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
27f40 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
27f50 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
27f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27f70 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
27f80 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
27f90 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
27fa0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
27fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
27fc0 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
27fd0 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20  & WHERE_IPK );. 
27fe0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
27ff0 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
28000 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
28010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
28020 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ( rc==pWInfo->pO
28030 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
28040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28050 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49  WInfo->bOrderedI
28060 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20  nnerLoop = 1;.  
28070 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
28080 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b  fo->revMask = m;
28090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
280a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
280b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
280c0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
280d0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
280e0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
280f0 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
28100 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
28110 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
28120 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e  >nExpr && nLoop>
28130 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42  0.    ){.      B
28140 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
28150 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   0;.      int nO
28160 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68  rder = wherePath
28170 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
28180 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
28190 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
281a0 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20        pFrom, 0, 
281b0 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
281c0 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
281d0 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29  &revMask.      )
281e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
281f0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d  pWInfo->sorted==
28200 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
28210 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70  Order==pWInfo->p
28220 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
28230 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
28240 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  ->sorted = 1;.  
28250 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
28260 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
28270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28280 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   }...  pWInfo->n
28290 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
282a0 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
282b0 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
282c0 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
282d0 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
282e0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53  3DbFreeNN(db, pS
282f0 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
28300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
28310 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
28320 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
28330 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
28340 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
28350 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
28360 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
28370 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
28380 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
28390 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
283a0 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
283b0 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
283c0 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
283d0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
283e0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
283f0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
28400 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
28410 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
28420 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
28430 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
28440 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
28450 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
28460 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
28470 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
28480 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
28490 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
284a0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
284b0 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
284c0 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
284d0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
284e0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
284f0 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
28500 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
28510 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
28520 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
28530 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
28540 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
28550 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
28560 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
28570 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
28580 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
28590 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
285a0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
285b0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
285c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
285d0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
285e0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
285f0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
28600 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
28610 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65  R_SUBCLAUSE ) re
28620 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
28630 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
28640 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
28650 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
28660 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
28670 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
28680 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
28690 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
286a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
286b0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
286c0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
286d0 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
286e0 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
286f0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
28700 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
28710 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
28720 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
28730 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  Loop->nSkip = 0;
28740 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74  .  pTerm = sqlit
28750 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
28760 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
28770 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30  , WO_EQ|WO_IS, 0
28780 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
28790 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
287a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
287b0 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
287c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
287d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
287e0 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
287f0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
28800 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
28810 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
28820 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
28830 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
28840 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
28850 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
28860 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
28870 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
28880 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
28890 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
288a0 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
288b0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
288c0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
288d0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
288e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
288f0 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20  nt opMask;.     
28900 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
28910 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
28920 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
28930 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
28940 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20  eIndex(pIdx).   
28950 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
28960 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
28970 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
28980 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65  KeyCol>ArraySize
28990 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
289a0 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
289b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70  ntinue;.      op
289c0 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69  Mask = pIdx->uni
289d0 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45  qNotNull ? (WO_E
289e0 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51  Q|WO_IS) : WO_EQ
289f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
28a00 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
28a10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
28a20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
28a30 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
28a40 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70  , iCur, j, 0, op
28a50 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
28a60 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
28a70 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
28a80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28a90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28aa0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
28ab0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
28ac0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
28ad0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
28ae0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
28af0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28b00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
28b10 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
28b20 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
28b30 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
28b40 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
28b50 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
28b60 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64  m->colUsed & pId
28b70 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d  x->colNotIdxed)=
28b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
28b90 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
28ba0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
28bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
28bc0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
28bd0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
28be0 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
28bf0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
28c00 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
28c10 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
28c20 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
28c30 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
28c40 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
28c50 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
28c60 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
28c70 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
28c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28c90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
28ca0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
28cb0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
28cc0 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
28cd0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
28ce0 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
28cf0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
28d00 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26  >sMaskSet.n==1 &
28d10 26 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e  & iCur==pWInfo->
28d20 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29  sMaskSet.ix[0] )
28d30 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
28d40 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71  kSelf = 1; /* sq
28d50 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
28d60 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
28d70 53 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20  Set, iCur); */. 
28d80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
28d90 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
28da0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
28db0 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
28dc0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
28dd0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
28de0 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  at =  pWInfo->pO
28df0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
28e00 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
28e10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28e20 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
28e30 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
28e40 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
28e50 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
28e60 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
28e70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28e80 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
28e90 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
28ea0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28eb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28ec0 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
28ed0 6e 20 66 6f 72 20 65 78 70 72 49 73 44 65 74 65  n for exprIsDete
28ee0 72 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a  rministic()..*/.
28ef0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
28f00 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74  odeIsDeterminist
28f10 69 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ic(Walker *pWalk
28f20 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
28f30 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
28f40 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
28f50 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
28f60 79 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73  y(pExpr, EP_Cons
28f70 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20  tFunc)==0 ){.   
28f80 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
28f90 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
28fa0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
28fb0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28fc0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  inue;.}../*.** R
28fd0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
28fe0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
28ff0 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74  tains no non-det
29000 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a  erministic SQL .
29010 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f  ** functions. Do
29020 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f   not consider no
29030 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
29040 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  SQL functions th
29050 61 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20  at are .** part 
29060 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74  of sub-select st
29070 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
29080 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 44 65  tic int exprIsDe
29090 74 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72  terministic(Expr
290a0 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77   *p){.  Walker w
290b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
290c0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
290d0 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
290e0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
290f0 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72   exprNodeIsDeter
29100 6d 69 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53  ministic;.  w.xS
29110 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
29120 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
29130 6b 46 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  kFail;.  sqlite3
29140 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
29150 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
29160 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
29170 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
29180 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
29190 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
291a0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
291b0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
291c0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
291d0 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
291e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
291f0 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
29200 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
29210 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
29220 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
29230 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
29240 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
29250 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
29260 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
29270 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
29280 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
29290 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
292a0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
292b0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
292c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
292d0 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
292e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
292f0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
29300 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
29310 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
29320 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
29330 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
29340 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
29350 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
29360 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
29370 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
29380 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
29390 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
293a0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
293b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
293c0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
293d0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
293e0 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
293f0 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
29400 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
29410 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
29420 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
29430 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
29440 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
29450 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
29460 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
29470 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
29480 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
29490 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
294a0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
294b0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
294c0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
294d0 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
294e0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
294f0 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
29500 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
29510 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
29520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29530 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
29540 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
29550 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
29560 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
29570 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
29580 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
295b0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
295c0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
295d0 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
295e0 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
295f0 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
29600 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29610 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
29620 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
29630 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
29640 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
29650 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
29660 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
29670 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
29680 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
29690 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
296a0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
296b0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
296c0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
296d0 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
296e0 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
296f0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
29700 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
29710 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
29720 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
29730 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
29740 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
29750 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
29760 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
29770 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
29780 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
29790 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
297a0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
297b0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
297c0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
297d0 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
297e0 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
297f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
29800 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
29810 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
29820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
29830 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
29840 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
29850 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
29860 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
29870 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
29880 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
29890 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
298a0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
298b0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
298c0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
298d0 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
298e0 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
298f0 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
29900 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
29910 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
29920 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
29930 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
29940 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
29950 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
29960 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
29970 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
29980 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
29990 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
299a0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
299b0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
299c0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
299d0 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
299e0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
299f0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
29a00 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
29a10 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
29a20 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
29a30 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
29a40 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
29a50 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
29a60 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
29a70 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
29a80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
29a90 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
29aa0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
29ab0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
29ac0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
29ad0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
29ae0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
29af0 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
29b00 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
29b10 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
29b20 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
29b30 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
29b40 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
29b50 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
29b60 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
29b70 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
29b80 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
29b90 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
29ba0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
29bb0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
29bc0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
29bd0 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
29be0 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
29bf0 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
29c00 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
29c10 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
29c20 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
29c30 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
29c40 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
29c50 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
29c60 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
29c70 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
29c80 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
29c90 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
29ca0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
29cb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
29cc0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
29cd0 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
29ce0 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
29cf0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
29d00 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
29d10 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
29d20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
29d30 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
29d40 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
29d50 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
29d60 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
29d70 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
29d80 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
29d90 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
29da0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
29db0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
29dc0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
29dd0 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
29de0 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
29df0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
29e00 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
29e10 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
29e20 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
29e30 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
29e40 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
29e50 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
29e60 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
29e70 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
29e80 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
29e90 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
29ea0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
29eb0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
29ec0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
29ed0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
29ee0 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
29ef0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
29f00 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
29f10 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
29f20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
29f30 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
29f40 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69  E_OR_SUBCLAUSE i
29f50 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
29f60 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
29f70 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
29f80 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
29f90 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
29fa0 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
29fb0 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
29fc0 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
29fd0 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
29fe0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
29ff0 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
2a000 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
2a010 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
2a020 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
2a030 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
2a040 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
2a050 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
2a060 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2a070 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
2a080 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
2a090 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
2a0a0 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
2a0b0 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
2a0c0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
2a0d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2a0e0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2a0f0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2a100 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2a110 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  t,      /* FROM 
2a120 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
2a130 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
2a140 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
2a150 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2a160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2a170 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a180 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2a190 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f  rBy,     /* An O
2a1a0 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
2a1b0 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72  P BY) clause, or
2a1c0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2a1d0 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
2a1e0 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75     /* Query resu
2a1f0 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64 20 66  lt set.  Req'd f
2a200 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  or DISTINCT */. 
2a210 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
2a220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a230 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
2a240 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
2a250 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41  nt.h */.  int iA
2a260 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20  uxArg           
2a270 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52    /* If WHERE_OR
2a280 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
2a290 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
2a2a0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2c0 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45   ** If WHERE_USE
2a2d0 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65  _LIMIT, then the
2a2e0 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f   limit amount */
2a2f0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
2a300 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
2a310 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
2a320 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
2a330 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
2a340 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a360 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2a370 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
2a380 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2a390 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
2a3a0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
2a3b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2a3c0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a3d0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
2a3e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
2a3f0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2a400 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
2a410 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2a420 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
2a430 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
2a440 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
2a450 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
2a460 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
2a470 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
2a480 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
2a490 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2a4a0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2a4b0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2a4c0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2a4d0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2a4e0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2a4f0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2a500 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2a510 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2a520 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
2a530 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
2a540 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
2a550 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2a580 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
2a590 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a5a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2a5b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2a5c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a5e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
2a5f0 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
2a600 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
2a610 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
2a620 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
2a630 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
2a640 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2a650 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a660 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
2a670 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
2a680 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2a690 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
2a6a0 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
2a6b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a6c0 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
2a6d0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
2a6e0 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
2a6f0 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57  R_SUBCLAUSE or W
2a700 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
2a710 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
2a720 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a730 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2a740 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2a750 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a760 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
2a770 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
2a780 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
2a790 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
2a7a0 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
2a7b0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
2a7c0 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
2a7d0 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
2a7e0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
2a7f0 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
2a800 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
2a810 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
2a820 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
2a830 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
2a840 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
2a850 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
2a860 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
2a870 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
2a880 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
2a890 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
2a8a0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
2a8b0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
2a8c0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
2a8d0 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
2a8e0 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
2a8f0 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
2a900 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2a910 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
2a920 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
2a930 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
2a940 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2a950 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
2a960 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
2a970 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
2a980 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
2a990 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2a9a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a9b0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
2a9c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2a9d0 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
2a9e0 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
2a9f0 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
2aa00 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
2aa10 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2aa20 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
2aa30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2aa40 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
2aa50 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
2aa60 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
2aa70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2aa80 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2aa90 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
2aaa0 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
2aab0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
2aac0 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
2aad0 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
2aae0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2aaf0 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  SE flag is set, 
2ab00 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2ab10 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2ab20 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2ab30 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2ab40 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2ab50 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2ab60 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2ab70 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2ab80 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2ab90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2aba0 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2abb0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2abc0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2abd0 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
2abe0 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
2abf0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2ac00 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
2ac10 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
2ac20 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
2ac30 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
2ac40 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
2ac50 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
2ac60 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
2ac70 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
2ac80 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
2ac90 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
2aca0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
2acb0 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
2acc0 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
2acd0 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
2ace0 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
2acf0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
2ad00 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
2ad10 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
2ad20 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
2ad30 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
2ad40 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
2ad50 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
2ad60 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
2ad70 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
2ad80 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
2ad90 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
2ada0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
2adb0 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
2adc0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
2add0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2ade0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
2adf0 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
2ae00 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
2ae10 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
2ae20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2ae30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2ae40 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2ae50 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
2ae60 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2ae70 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
2ae80 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2ae90 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2aea0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2aeb0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2aec0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
2aed0 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
2aee0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
2aef0 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c    pWInfo->pResul
2af00 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65  tSet = pResultSe
2af10 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43  t;.  pWInfo->aiC
2af20 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
2af30 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
2af40 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  ass[1] = -1;.  p
2af50 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
2af60 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
2af70 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49  fo->iBreak = pWI
2af80 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2af90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2afa0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
2afb0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2afc0 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
2afd0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d  ;.  pWInfo->iLim
2afe0 69 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20  it = iAuxArg;.  
2aff0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2b000 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
2b010 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
2b020 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e  memset(&pWInfo->
2b030 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20  nOBSat, 0, .    
2b040 20 20 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68       offsetof(Wh
2b050 65 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f  ereInfo,sWC) - o
2b060 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66  ffsetof(WhereInf
2b070 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65  o,nOBSat));.  me
2b080 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b  mset(&pWInfo->a[
2b090 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68  0], 0, sizeof(Wh
2b0a0 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73  ereLoop)+nTabLis
2b0b0 74 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  t*sizeof(WhereLe
2b0c0 76 65 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28  vel));.  assert(
2b0d0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2b0e0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s==ONEPASS_OFF )
2b0f0 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65  ;  /* ONEPASS de
2b100 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f  faults to OFF */
2b110 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
2b120 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
2b130 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
2b140 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
2b150 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
2b160 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
2b170 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28  = (WhereLoop*)((
2b180 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e  (char*)pWInfo)+n
2b190 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73  ByteWInfo);.  as
2b1a0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2b1b0 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e  _ALIGNMENT(sWLB.
2b1c0 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65  pNew) );.  where
2b1d0 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e  LoopInit(sWLB.pN
2b1e0 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ew);.#ifdef SQLI
2b1f0 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e  TE_DEBUG.  sWLB.
2b200 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b  pNew->cId = '*';
2b210 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70  .#endif..  /* Sp
2b220 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
2b230 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
2b240 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
2b250 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
2b260 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
2b270 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
2b280 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
2b290 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
2b2a0 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
2b2b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
2b2c0 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
2b2d0 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
2b2e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
2b2f0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
2b300 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
2b310 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  ;.    .  /* Spec
2b320 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f  ial case: No FRO
2b330 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
2b340 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
2b350 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
2b360 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
2b370 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d  BSat = pOrderBy-
2b380 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
2b390 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b3a0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2b3b0 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
2b3c0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2b3d0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2b3e0 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45  QUE;.    }.    E
2b3f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2b400 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41  (pParse, 0, "SCA
2b410 4e 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 22 29  N CONSTANT ROW")
2b420 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b430 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
2b440 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
2b450 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
2b460 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b470 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2b480 20 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f   The N-th term o
2b490 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2b4a0 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20  e is assigned a 
2b4b0 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e  bitmask of 1<<N.
2b4c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b4d0 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
2b4e0 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
2b4f0 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
2b500 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
2b510 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74  k for.    ** a t
2b520 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31  able T, then X-1
2b530 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
2b540 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  for all other ta
2b550 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
2b560 20 6f 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e   of T..    ** Kn
2b570 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
2b580 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
2b590 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2b5a0 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20  a left join is. 
2b5b0 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e     ** important.
2b5c0 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
2b5d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2b5e0 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2b5f0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2b600 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2b610 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2b620 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
2b630 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
2b640 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
2b650 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
2b660 6e 6f 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  normally.    ** 
2b670 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
2b680 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
2b690 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
2b6a0 6f 20 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a  o 1 if the.    *
2b6b0 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
2b6c0 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
2b6d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20  ..    */.    ii 
2b6e0 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
2b6f0 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
2b700 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2b710 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
2b720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
2b730 68 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28  hereTabFuncArgs(
2b740 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73  pParse, &pTabLis
2b750 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66  t->a[ii], &pWInf
2b760 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68  o->sWC);.    }wh
2b770 69 6c 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62  ile( (++ii)<pTab
2b780 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2b790 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2b7a0 42 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  BUG.    {.      
2b7b0 42 69 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a  Bitmask mx = 0;.
2b7c0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2b7d0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
2b7e0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
2b7f0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71    Bitmask m = sq
2b800 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
2b810 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2b820 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
2b830 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  sor);.        as
2b840 73 65 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20  sert( m>=mx );. 
2b850 20 20 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20         mx = m;. 
2b860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23       }.    }.  #
2b870 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f  endif.  }.  .  /
2b880 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
2b890 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
2b8a0 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2b8b0 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
2b8c0 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
2b8d0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
2b8e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b8f0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2b900 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
2b910 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48  Special case: WH
2b920 45 52 45 20 74 65 72 6d 73 20 74 68 61 74 20 64  ERE terms that d
2b930 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  o not refer to a
2b940 6e 79 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ny tables in the
2b950 20 6a 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73   join.  ** (cons
2b960 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
2b970 29 2e 20 45 76 61 6c 75 61 74 65 20 65 61 63 68  ). Evaluate each
2b980 20 73 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20   such term, and 
2b990 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68  jump over all th
2b9a0 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64  e.  ** generated
2b9b0 20 63 6f 64 65 20 69 66 20 74 68 65 20 72 65 73   code if the res
2b9c0 75 6c 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e  ult is not true.
2b9d0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20    .  **.  ** Do 
2b9e0 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 74  not do this if t
2b9f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
2ba00 6e 74 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72  ntains non-deter
2ba10 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
2ba20 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65  ns.  ** that are
2ba30 20 6e 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75   not within a su
2ba40 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69  b-select. This i
2ba50 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72  s not strictly r
2ba60 65 71 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a  equired, but.  *
2ba70 2a 20 70 72 65 73 65 72 76 65 73 20 53 51 4c 69  * preserves SQLi
2ba80 74 65 27 73 20 6c 65 67 61 63 79 20 62 65 68 61  te's legacy beha
2ba90 76 69 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c  viour in the fol
2baa0 6c 6f 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73  lowing two cases
2bab0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52  :.  **.  **   FR
2bac0 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e  OM ... WHERE ran
2bad0 64 6f 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20  dom()>0;        
2bae0 20 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f     -- eval rando
2baf0 6d 28 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77  m() once per row
2bb00 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e  .  **   FROM ...
2bb10 20 57 48 45 52 45 20 28 53 45 4c 45 43 54 20 72   WHERE (SELECT r
2bb20 61 6e 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20  andom())>0;  -- 
2bb30 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e  eval random() on
2bb40 63 65 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a  ce overall.  */.
2bb50 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
2bb60 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
2bb70 69 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  ii++){.    Where
2bb80 54 65 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42  Term *pT = &sWLB
2bb90 2e 70 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  .pWC->a[ii];.   
2bba0 20 69 66 28 20 70 54 2d 3e 77 74 46 6c 61 67 73   if( pT->wtFlags
2bbb0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
2bbc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bbd0 69 66 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c  if( pT->prereqAl
2bbe0 6c 3d 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73  l==0 && (nTabLis
2bbf0 74 3d 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65  t==0 || exprIsDe
2bc00 74 65 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e  terministic(pT->
2bc10 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20  pExpr)) ){.     
2bc20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2bc30 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e  lse(pParse, pT->
2bc40 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69  pExpr, pWInfo->i
2bc50 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
2bc60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
2bc70 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20   pT->wtFlags |= 
2bc80 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
2bc90 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74  }.  }..  if( wct
2bca0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2bcb0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
2bcc0 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
2bcd0 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
2bce0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
2bcf0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
2bd00 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
2bd10 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
2bd20 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
2bd30 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
2bd40 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
2bd50 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
2bd60 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2bd70 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
2bd80 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
2bd90 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
2bda0 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
2bdb0 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
2bdc0 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
2bdd0 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
2bde0 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
2bdf0 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
2be00 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
2be10 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
2be20 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
2be30 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
2be40 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
2be50 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2be60 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66  jects */.#if def
2be70 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
2be80 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73  ENABLED).  if( s
2be90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2bea0 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20   & 0xffff ){.   
2beb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bec0 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ntf("*** Optimiz
2bed0 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63  er Start *** (wc
2bee0 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c  trlFlags: 0x%x",
2bef0 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
2bf00 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2bf10 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
2bf20 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
2bf30 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
2bf40 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75   limit: %d", iAu
2bf50 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xArg);.    }.   
2bf60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bf70 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a  ntf(")\n");.  }.
2bf80 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2bf90 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
2bfa0 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  ){ /* Display al
2bfb0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
2bfc0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2bfd0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2bfe0 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e  lausePrint(sWLB.
2bff0 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
2c000 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ..  if( nTabList
2c010 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
2c020 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
2c030 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
2c040 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
2c050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2c060 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2c070 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20  rror;.  .#ifdef 
2c080 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2c090 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
2c0a0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20  e3WhereTrace ){ 
2c0b0 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
2c0c0 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
2c0d0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
2c0e0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
2c0f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
2c100 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
2c110 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  t char zLabel[] 
2c120 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
2c130 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
2c140 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c170 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
2c180 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
2c190 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
2c1a0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
2c1b0 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
2c1c0 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
2c1d0 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
2c1e0 4c 61 62 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28  Label[i%(sizeof(
2c1f0 7a 4c 61 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20  zLabel)-1)];.   
2c200 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
2c210 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
2c220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c230 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
2c240 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
2c250 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
2c260 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2c270 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2c280 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
2c290 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2c2a0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
2c2b0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
2c2c0 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
2c2d0 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
2c2e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c2f0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2c300 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2c310 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
2c320 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
2c330 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
2c340 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
2c350 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
2c360 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
2c370 6b 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d  k = ALLBITS;.  }
2c380 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2c390 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
2c3a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
2c3b0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2c3c0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2c3d0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2c3e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2c3f0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2c400 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
2c410 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
2c420 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
2c430 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
2c440 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
2c450 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
2c460 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c470 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
2c480 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
2c490 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
2c4a0 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
2c4b0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
2c4c0 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
2c4d0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2c4e0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
2c4f0 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
2c500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2c510 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
2c520 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
2c530 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
2c550 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2c560 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
2c570 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c580 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2c590 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
2c5a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c5b0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2c5c0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2c5d0 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
2c5e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c5f0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2c600 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
2c610 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c630 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2c640 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
2c650 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
2c660 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
2c670 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
2c680 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
2c690 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
2c6a0 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
2c6b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2c6c0 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20  Attempt to omit 
2c6d0 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20  tables from the 
2c6e0 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74  join that do not
2c6f0 20 61 66 66 65 63 74 20 74 68 65 20 72 65 73 75   affect the resu
2c700 6c 74 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74  lt..  ** For a t
2c710 61 62 6c 65 20 74 6f 20 6e 6f 74 20 61 66 66 65  able to not affe
2c720 63 74 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74  ct the result, t
2c730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73  he following mus
2c740 74 20 62 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  t be true:.  **.
2c750 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 71 75    **   1) The qu
2c760 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
2c770 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 20 20  an aggregate..  
2c780 2a 2a 20 20 20 32 29 20 54 68 65 20 74 61 62 6c  **   2) The tabl
2c790 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 52 48  e must be the RH
2c7a0 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  S of a LEFT JOIN
2c7b0 2e 0a 20 20 2a 2a 20 20 20 33 29 20 45 69 74 68  ..  **   3) Eith
2c7c0 65 72 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  er the query mus
2c7d0 74 20 62 65 20 44 49 53 54 49 4e 43 54 2c 20 6f  t be DISTINCT, o
2c7e0 72 20 65 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72  r else the ON or
2c7f0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20   USING clause.  
2c800 2a 2a 20 20 20 20 20 20 6d 75 73 74 20 63 6f 6e  **      must con
2c810 74 61 69 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e  tain a constrain
2c820 74 20 74 68 61 74 20 6c 69 6d 69 74 73 20 74 68  t that limits th
2c830 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61  e scan of the ta
2c840 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20  ble to .  **    
2c850 20 20 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67    at most a sing
2c860 6c 65 20 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34  le row..  **   4
2c870 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74  ) The table must
2c880 20 6e 6f 74 20 62 65 20 72 65 66 65 72 65 6e 63   not be referenc
2c890 65 64 20 62 79 20 61 6e 79 20 70 61 72 74 20 6f  ed by any part o
2c8a0 66 20 74 68 65 20 71 75 65 72 79 20 61 70 61 72  f the query apar
2c8b0 74 0a 20 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d  t.  **      from
2c8c0 20 69 74 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f   its own USING o
2c8d0 72 20 4f 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a  r ON clause..  *
2c8e0 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70  *.  ** For examp
2c8f0 6c 65 2c 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a  le, given:.  **.
2c900 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
2c910 54 41 42 4c 45 20 74 31 28 69 70 6b 20 49 4e 54  TABLE t1(ipk INT
2c920 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2c930 2c 20 76 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20  , v1);.  **     
2c940 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
2c950 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ipk INTEGER PRIM
2c960 41 52 59 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20  ARY KEY, v2);.  
2c970 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2c980 42 4c 45 20 74 33 28 69 70 6b 20 49 4e 54 45 47  BLE t3(ipk INTEG
2c990 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2c9a0 76 33 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74  v3);.  **.  ** t
2c9b0 68 65 6e 20 74 61 62 6c 65 20 74 32 20 63 61 6e  hen table t2 can
2c9c0 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   be omitted from
2c9d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2c9e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2c9f0 4c 45 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d  LECT v1, v3 FROM
2ca00 20 74 31 20 0a 20 20 2a 2a 20 20 20 20 20 20 20   t1 .  **       
2ca10 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49  LEFT JOIN t2 USI
2ca20 4e 47 20 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70  NG (t1.ipk=t2.ip
2ca30 6b 29 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45  k).  **       LE
2ca40 46 54 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47  FT JOIN t3 USING
2ca50 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29   (t1.ipk=t3.ipk)
2ca60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72  .  **.  ** or fr
2ca70 6f 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  om:.  **.  **   
2ca80 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2ca90 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31  T v1, v3 FROM t1
2caa0 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46   .  **       LEF
2cab0 54 20 4a 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20  T JOIN t2.  **  
2cac0 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2cad0 33 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d  3 USING (t1.ipk=
2cae0 74 33 2e 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e  t3.ipk).  */.  n
2caf0 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
2cb00 61 73 6b 29 30 3b 0a 20 20 69 66 28 20 70 57 49  ask)0;.  if( pWI
2cb10 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
2cb20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
2cb30 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2cb40 20 2f 2a 20 67 75 61 72 61 6e 74 65 65 73 20 63   /* guarantees c
2cb50 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
2cb60 76 65 20 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69  ve */.   && Opti
2cb70 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2cb80 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e  db, SQLITE_OmitN
2cb90 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20  oopJoin).  ){.  
2cba0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 69 74    int i;.    Bit
2cbb0 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73  mask tabUsed = s
2cbc0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
2cbd0 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
2cbe0 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
2cbf0 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
2cc00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
2cc10 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
2cc20 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2cc30 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
2cc40 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
2cc50 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 70 57    }.    for(i=pW
2cc60 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2cc70 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=1; i--){.    
2cc80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2cc90 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
2cca0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ccb0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2ccc0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
2ccd0 6f 2d 3e 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a  o->a[i].pWLoop;.
2cce0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
2ccf0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2cd00 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b  >a[pLoop->iTab];
2cd10 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65  .      if( (pIte
2cd20 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2cd30 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63   JT_LEFT)==0 ) c
2cd40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2cd50 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2cd60 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2cd70 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
2cd80 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2cd90 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2cda0 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
2cdb0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cdc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2cdd0 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
2cde0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
2cdf0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2ce00 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
2ce10 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
2ce20 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
2ce30 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2ce40 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2ce50 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2ce60 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2ce70 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2ce80 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2ce90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2cea0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ceb0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
2cec0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
2ced0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72           || pTer
2cee0 6d 2d 3e 70 45 78 70 72 2d 3e 69 52 69 67 68 74  m->pExpr->iRight
2cef0 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d  JoinTable!=pItem
2cf00 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20  ->iCursor.      
2cf10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2cf20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cf30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2cf40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2cf50 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 63  ( pTerm<pEnd ) c
2cf60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
2cf70 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
2cf80 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70  , ("-> drop loop
2cf90 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c   %c not used\n",
2cfa0 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20   pLoop->cId));. 
2cfb0 20 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d       notReady &=
2cfc0 20 7e 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   ~pLoop->maskSel
2cfd0 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  f;.      for(pTe
2cfe0 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
2cff0 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
2d000 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
2d010 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
2d020 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
2d030 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20  kSelf)!=0 ){.   
2d040 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
2d050 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2d060 44 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  DED;.        }. 
2d070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d080 20 69 21 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   i!=pWInfo->nLev
2d090 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  el-1 ){.        
2d0a0 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 57 49  int nByte = (pWI
2d0b0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29  nfo->nLevel-1-i)
2d0c0 20 2a 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   * sizeof(WhereL
2d0d0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d  evel);.        m
2d0e0 65 6d 6d 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e  emmove(&pWInfo->
2d0f0 61 5b 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61  a[i], &pWInfo->a
2d100 5b 69 2b 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  [i+1], nByte);. 
2d110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 49       }.      pWI
2d120 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20  nfo->nLevel--;. 
2d130 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b       nTabList--;
2d140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
2d150 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
2d160 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
2d170 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
2d180 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
2d190 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
2d1a0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
2d1b0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
2d1c0 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
2d1d0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
2d1e0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
2d1f0 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
2d200 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
2d210 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
2d220 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
2d230 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
2d240 20 2a 2a 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70   **.  ** A one-p
2d250 61 73 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e  ass approach can
2d260 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
2d270 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
2d280 73 74 65 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e  sted one.  ** an
2d290 64 20 65 69 74 68 65 72 20 28 61 29 20 74 68 65  d either (a) the
2d2a0 20 73 63 61 6e 20 76 69 73 69 74 73 20 61 74 20   scan visits at 
2d2b0 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20  most one row or 
2d2c0 28 62 29 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66  (b) each.  ** of
2d2d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2d2e0 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  re true:.  **.  
2d2f0 2a 2a 20 20 20 2a 20 74 68 65 20 63 61 6c 6c 65  **   * the calle
2d300 72 20 68 61 73 20 69 6e 64 69 63 61 74 65 64 20  r has indicated 
2d310 74 68 61 74 20 61 20 6f 6e 65 2d 70 61 73 73 20  that a one-pass 
2d320 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20  approach can be 
2d330 75 73 65 64 0a 20 20 2a 2a 20 20 20 20 20 77 69  used.  **     wi
2d340 74 68 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  th multiple rows
2d350 20 28 62 79 20 73 65 74 74 69 6e 67 20 57 48 45   (by setting WHE
2d360 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2d370 52 4f 57 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20  ROW), and.  **  
2d380 20 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20   * the table is 
2d390 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
2d3a0 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  ble, and.  **   
2d3b0 2a 20 65 69 74 68 65 72 20 74 68 65 20 73 63 61  * either the sca
2d3c0 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74  n does not use t
2d3d0 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  he OR optimizati
2d3e0 6f 6e 20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  on or the caller
2d3f0 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 61 20 44  .  **     is a D
2d400 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20  ELETE operation 
2d410 28 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45  (WHERE_DUPLICATE
2d420 53 5f 4f 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65  S_OK is only spe
2d430 63 69 66 69 65 64 0a 20 20 2a 2a 20 20 20 20 20  cified.  **     
2d440 66 6f 72 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a  for DELETE)..  *
2d450 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
2d460 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 69 73  qualification is
2d470 20 62 65 63 61 75 73 65 20 61 6e 20 55 50 44 41   because an UPDA
2d480 54 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  TE statement use
2d490 73 0a 20 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f  s.  ** WhereInfo
2d4a0 2e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  .aiCurOnePass[1]
2d4b0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2d4c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20  ether or not it 
2d4d0 72 65 61 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20  really can.  ** 
2d4e0 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
2d4f0 70 70 72 6f 61 63 68 2c 20 61 6e 64 20 74 68 69  pproach, and thi
2d500 73 20 69 73 20 6e 6f 74 20 73 65 74 20 61 63 63  s is not set acc
2d510 75 72 61 74 65 6c 79 20 66 6f 72 20 73 63 61 6e  urately for scan
2d520 73 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65 20  s.  ** that use 
2d530 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
2d540 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ion..  */.  asse
2d550 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2d560 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2d570 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
2d580 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
2d590 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c   );.  if( (wctrl
2d5a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2d5b0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
2d5c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46  0 ){.    int wsF
2d5d0 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  lags = pWInfo->a
2d5e0 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
2d5f0 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e  ags;.    int bOn
2d600 65 72 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20  erow = (wsFlags 
2d610 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
2d620 3d 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  =0;.    assert( 
2d630 21 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  !(wsFlags & WHER
2d640 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  E_VIRTUALTABLE) 
2d650 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
2d660 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
2d670 29 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e  ) );.    if( bOn
2d680 65 72 6f 77 20 7c 7c 20 28 0a 20 20 20 20 20 20  erow || (.      
2d690 20 20 30 21 3d 28 77 63 74 72 6c 46 6c 61 67 73    0!=(wctrlFlags
2d6a0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2d6b0 5f 4d 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20  _MULTIROW).     
2d6c0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
2d6d0 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
2d6e0 62 29 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28  b).     && (0==(
2d6f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d700 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63  MULTI_OR) || (wc
2d710 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2d720 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29  _DUPLICATES_OK))
2d730 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70  .    )){.      p
2d740 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20  WInfo->eOnePass 
2d750 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50  = bOnerow ? ONEP
2d760 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45  ASS_SINGLE : ONE
2d770 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20  PASS_MULTI;.    
2d780 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
2d790 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
2d7a0 61 62 29 20 26 26 20 28 77 73 46 6c 61 67 73 20  ab) && (wsFlags 
2d7b0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2d7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2d7d0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2d7e0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
2d7f0 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  IROW ){.        
2d800 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f    bFordelete = O
2d810 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b  PFLAG_FORDELETE;
2d820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d830 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
2d840 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
2d850 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48  = (wsFlags & ~WH
2d860 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20  ERE_IDX_ONLY);. 
2d870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d880 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
2d890 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
2d8a0 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
2d8b0 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
2d8c0 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
2d8d0 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
2d8e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
2d8f0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2d900 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
2d910 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
2d920 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2d930 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
2d940 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
2d950 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
2d960 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
2d970 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2d980 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
2d990 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2d9a0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
2d9b0 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
2d9c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
2d9d0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
2d9e0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
2d9f0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
2da00 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
2da10 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
2da20 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
2da30 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
2da40 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
2da50 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2da60 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2da70 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
2da80 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
2da90 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
2daa0 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
2dab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2dac0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2dad0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2dae0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2daf0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
2db00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2db10 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
2db20 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
2db30 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
2db40 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
2db50 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2db60 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
2db70 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2db80 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
2db90 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
2dba0 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
2dbb0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
2dbc0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
2dbd0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
2dbe0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
2dbf0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2dc00 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2dc10 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
2dc20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2dc30 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2dc40 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AUSE)==0 ){.    
2dc50 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
2dc60 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66  enRead;.      if
2dc70 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2dc80 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
2dc90 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
2dca0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
2dcb0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
2dcc0 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
2dcd0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2dce0 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  r;.      };.    
2dcf0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
2dd00 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
2dd10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
2dd20 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
2dd30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2dd40 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  Item->iCursor==p
2dd50 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
2dd60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2dd70 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2dd80 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2dd90 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
2dda0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
2ddb0 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
2ddc0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2ddd0 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
2dde0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
2ddf0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
2de00 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2de10 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
2de20 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
2de30 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
2de40 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
2de50 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
2de60 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
2de70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
2de80 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
2de90 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
2dea0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
2deb0 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49  (v, -1, SQLITE_I
2dec0 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34  NT_TO_PTR(n), P4
2ded0 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20  _INT32);.       
2dee0 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
2def0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
2df00 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2df10 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
2df20 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c  NTS.      if( pL
2df30 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2df40 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
2df50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2df60 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2df70 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74  SEEKEQ|bFordelet
2df80 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  e);.      }else.
2df90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
2dfa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2dfb0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46  beChangeP5(v, bF
2dfc0 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  ordelete);.     
2dfd0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2dfe0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
2dff0 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73  SED_MASK.      s
2e000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2e010 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
2e020 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d  nsUsed, pTabItem
2e030 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c  ->iCursor, 0, 0,
2e040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e050 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
2e060 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49 74 65  nst u8*)&pTabIte
2e070 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49  m->colUsed, P4_I
2e080 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
2e090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2e0a0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
2e0b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
2e0c0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
2e0d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
2e0e0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2e0f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2e100 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
2e110 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f  Index *pIx = pLo
2e120 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2e130 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ex;.      int iI
2e140 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69  ndexCur;.      i
2e150 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
2e160 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41  ead;.      /* iA
2e170 75 78 41 72 67 20 69 73 20 61 6c 77 61 79 73 20  uxArg is always 
2e180 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
2e190 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41  e value if ONEPA
2e1a0 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a  SS is possible *
2e1b0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2e1c0 69 41 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70  iAuxArg!=0 || (p
2e1d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2e1e0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2e1f0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b  S_DESIRED)==0 );
2e200 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52  .      if( !HasR
2e210 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 49 73  owid(pTab) && Is
2e220 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
2e230 70 49 78 29 0a 20 20 20 20 20 20 20 26 26 20 28  pIx).       && (
2e240 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2e250 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2e260 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  !=0.      ){.   
2e270 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
2e280 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f  one term of an O
2e290 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75  R-optimization u
2e2a0 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  sing the PRIMARY
2e2b0 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20   KEY of a.      
2e2c0 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57    ** WITHOUT ROW
2e2d0 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65  ID table.  No ne
2e2e0 65 64 20 66 6f 72 20 61 20 73 65 70 61 72 61 74  ed for a separat
2e2f0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
2e300 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
2e310 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a  Level->iTabCur;.
2e320 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a          op = 0;.
2e330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e340 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2e350 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
2e360 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2e370 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  pJ = pTabItem->p
2e380 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2e390 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
2e3a0 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20   iAuxArg;.      
2e3b0 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
2e3c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2e3d0 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a  PASS_DESIRED );.
2e3e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41          while( A
2e3f0 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21  LWAYS(pJ) && pJ!
2e400 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20  =pIx ){.        
2e410 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20    iIndexCur++;. 
2e420 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a           pJ = pJ
2e430 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
2e440 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20   }.        op = 
2e450 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
2e460 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
2e470 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
2e480 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2e490 20 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78 41   }else if( iAuxA
2e4a0 72 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  rg && (wctrlFlag
2e4b0 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2e4c0 43 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20  CLAUSE)!=0 ){.  
2e4d0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2e4e0 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20  = iAuxArg;.     
2e4f0 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65     op = OP_Reope
2e500 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nIdx;.      }els
2e510 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  e{.        iInde
2e520 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
2e530 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Tab++;.      }. 
2e540 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
2e550 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72  xCur = iIndexCur
2e560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e570 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
2e580 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
2e590 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e       assert( iIn
2e5a0 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20  dexCur>=0 );.   
2e5b0 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20     if( op ){.   
2e5c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e5d0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49  AddOp3(v, op, iI
2e5e0 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
2e5f0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
2e600 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
2e610 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
2e620 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20  , pIx);.        
2e630 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2e640 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
2e650 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20  TRAINT)!=0.     
2e660 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
2e670 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2e680 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
2e690 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30  RE_SKIPSCAN))==0
2e6a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2e6b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2e6c0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
2e6d0 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  IN)==0.         
2e6e0 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
2e6f0 69 6e 63 74 21 3d 57 48 45 52 45 5f 44 49 53 54  inct!=WHERE_DIST
2e700 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20  INCT_ORDERED.   
2e710 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e720 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e730 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2e740 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74  SEEKEQ); /* Hint
2e750 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20   to COMDB2 */.  
2e760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e770 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e780 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
2e790 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
2e7a0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2e7b0 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
2e7c0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36    {.          u6
2e7d0 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20  4 colUsed = 0;. 
2e7e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c           int ii,
2e7f0 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66   jj;.          f
2e800 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d  or(ii=0; ii<pIx-
2e810 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  >nColumn; ii++){
2e820 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
2e830 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pIx->aiColumn[
2e840 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii];.           
2e850 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74   if( jj<0 ) cont
2e860 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2e870 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a    if( jj>63 ) jj
2e880 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20   = 63;.         
2e890 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d     if( (pTabItem
2e8a0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
2e8b0 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f  BIT(jj))==0 ) co
2e8c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e8d0 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28      colUsed |= (
2e8e0 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20  (u64)1)<<(ii<63 
2e8f0 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20  ? ii : 63);.    
2e900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e920 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
2e930 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65  lumnsUsed, iInde
2e940 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  xCur, 0, 0,.    
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e960 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38 2a              (u8*
2e970 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e  )&colUsed, P4_IN
2e980 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T64);.        }.
2e990 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e9a0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
2e9b0 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20  SED_MASK */.    
2e9c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2e9d0 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74  ( iDb>=0 ) sqlit
2e9e0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2e9f0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
2ea00 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
2ea10 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2ea20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2ea30 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2ea40 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2ea50 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2ea60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
2ea70 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
2ea80 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
2ea90 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2eaa0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
2eab0 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
2eac0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
2ead0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
2eae0 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
2eaf0 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ram..  */.  for(
2eb00 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73  ii=0; ii<nTabLis
2eb10 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  t; ii++){.    in
2eb20 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20  t addrExplain;. 
2eb30 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a     int wsFlags;.
2eb40 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2eb50 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
2eb60 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65   wsFlags = pLeve
2eb70 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
2eb80 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  gs;.#ifndef SQLI
2eb90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
2eba0 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20  C_INDEX.    if( 
2ebb0 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
2ebc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ebd0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
2ebe0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
2ebf0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
2ec00 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
2ec10 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20  ->sWC,.         
2ec20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74         &pTabList
2ec30 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2ec40 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  m], notReady, pL
2ec50 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
2ec60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2ec70 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2ec80 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
2ec90 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45  #endif.    addrE
2eca0 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33  xplain = sqlite3
2ecb0 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53  WhereExplainOneS
2ecc0 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61  can(.        pPa
2ecd0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2ece0 4c 65 76 65 6c 2c 20 77 63 74 72 6c 46 6c 61 67  Level, wctrlFlag
2ecf0 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65  s.    );.    pLe
2ed00 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20  vel->addrBody = 
2ed10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2ed20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e  ntAddr(v);.    n
2ed30 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65  otReady = sqlite
2ed40 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f  3WhereCodeOneLoo
2ed50 70 53 74 61 72 74 28 70 50 61 72 73 65 2c 76 2c  pStart(pParse,v,
2ed60 70 57 49 6e 66 6f 2c 69 69 2c 70 4c 65 76 65 6c  pWInfo,ii,pLevel
2ed70 2c 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20  ,notReady);.    
2ed80 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
2ed90 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
2eda0 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77  Cont;.    if( (w
2edb0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  sFlags&WHERE_MUL
2edc0 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63  TI_OR)==0 && (wc
2edd0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
2ede0 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
2edf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ee00 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74  WhereAddScanStat
2ee10 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20  us(v, pTabList, 
2ee20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c  pLevel, addrExpl
2ee30 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ain);.    }.  }.
2ee40 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20  .  /* Done. */. 
2ee50 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
2ee60 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
2ee70 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72  ERE-core"));.  r
2ee80 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
2ee90 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
2eea0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
2eeb0 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72  .whereBeginError
2eec0 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  :.  if( pWInfo )
2eed0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  {.    pParse->nQ
2eee0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
2eef0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
2ef00 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66  op;.    whereInf
2ef10 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
2ef20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ef30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74  0;.}../*.** Part
2ef40 20 6f 66 20 73 71 6c 69 74 65 33 57 68 65 72 65   of sqlite3Where
2ef50 45 6e 64 28 29 20 77 69 6c 6c 20 72 65 77 72 69  End() will rewri
2ef60 74 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 72 65  te opcodes to re
2ef70 66 65 72 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69  ference the.** i
2ef80 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
2ef90 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
2efa0 20 20 49 6e 20 53 51 4c 49 54 45 5f 44 45 42 55    In SQLITE_DEBU
2efb0 47 20 6d 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a  G mode, we want.
2efc0 2a 2a 20 74 6f 20 74 72 61 63 65 20 74 68 6f 73  ** to trace thos
2efd0 65 20 63 68 61 6e 67 65 73 20 69 66 20 50 52 41  e changes if PRA
2efe0 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72  GMA vdbe_addoptr
2eff0 61 63 65 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f  ace=on.  This ro
2f000 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68  utine.** does th
2f010 61 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  at..*/.#ifndef S
2f020 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 64 65  QLITE_DEBUG.# de
2f030 66 69 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69  fine OpcodeRewri
2f040 74 65 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f  teTrace(D,K,P) /
2f050 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65  * no-op */.#else
2f060 0a 23 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65  .# define Opcode
2f070 52 65 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b  RewriteTrace(D,K
2f080 2c 50 29 20 73 71 6c 69 74 65 33 57 68 65 72 65  ,P) sqlite3Where
2f090 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54 72 61  OpcodeRewriteTra
2f0a0 63 65 28 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74  ce(D,K,P).  stat
2f0b0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 57  ic void sqlite3W
2f0c0 68 65 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74  hereOpcodeRewrit
2f0d0 65 54 72 61 63 65 28 0a 20 20 20 20 73 71 6c 69  eTrace(.    sqli
2f0e0 74 65 33 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74  te3 *db,.    int
2f0f0 20 70 63 2c 0a 20 20 20 20 56 64 62 65 4f 70 20   pc,.    VdbeOp 
2f100 2a 70 4f 70 0a 20 20 29 7b 0a 20 20 20 20 69 66  *pOp.  ){.    if
2f110 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
2f120 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
2f130 72 61 63 65 29 3d 3d 30 20 29 20 72 65 74 75 72  race)==0 ) retur
2f140 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
2f150 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c  bePrintOp(0, pc,
2f160 20 70 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   pOp);.  }.#endi
2f170 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
2f180 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
2f190 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
2f1a0 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
2f1b0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
2f1c0 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
2f1d0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2f1e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f1f0 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
2f200 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
2f210 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2f220 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
2f230 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2f240 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2f250 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
2f260 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
2f270 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
2f280 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2f290 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2f2a0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
2f2b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2f2c0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
2f2d0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
2f2e0 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56  n code..  */.  V
2f2f0 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2f300 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
2f310 63 6f 72 65 22 29 29 3b 0a 20 20 66 6f 72 28 69  core"));.  for(i
2f320 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2f330 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2f340 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
2f350 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2f360 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
2f370 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2f380 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  oop;.    if( pLe
2f390 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
2f3a0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2f3b0 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41  TE_DISABLE_SKIPA
2f3c0 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20  HEAD_DISTINCT.  
2f3d0 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b      int addrSeek
2f3e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65   = 0;.      Inde
2f3f0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69  x *pIdx;.      i
2f400 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt n;.      if( 
2f410 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2f420 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
2f430 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20  T_ORDERED.      
2f440 20 26 26 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e   && i==pWInfo->n
2f450 4c 65 76 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b  Level-1  /* Tick
2f460 65 74 20 5b 65 66 39 33 31 38 37 35 37 62 31 35  et [ef9318757b15
2f470 32 65 33 5d 20 32 30 31 37 2d 31 30 2d 32 31 20  2e3] 2017-10-21 
2f480 2a 2f 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  */.       && (pL
2f490 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2f4a0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2f4b0 0a 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78  .       && (pIdx
2f4c0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2f4d0 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74  e.pIndex)->hasSt
2f4e0 61 74 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e  at1.       && (n
2f4f0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2f500 65 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20  e.nIdxCol)>0.   
2f510 20 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52      && pIdx->aiR
2f520 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a  owLogEst[n]>=36.
2f530 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f540 20 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65   int r1 = pParse
2f550 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
2f560 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20    int j, op;.   
2f570 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2f580 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2f590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f5a0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
2f5b0 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  n, pLevel->iIdxC
2f5c0 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20  ur, j, r1+j);.  
2f5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f5e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2f5f0 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  n+1;.        op 
2f600 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  = pLevel->op==OP
2f610 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c  _Prev ? OP_SeekL
2f620 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20  T : OP_SeekGT;. 
2f630 20 20 20 20 20 20 20 61 64 64 72 53 65 65 6b 20         addrSeek 
2f640 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2f650 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c  Op4Int(v, op, pL
2f660 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30  evel->iIdxCur, 0
2f670 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20  , r1, n);.      
2f680 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2f690 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
2f6a0 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
2f6b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
2f6c0 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20  ==OP_SeekGT);.  
2f6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f6e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2f6f0 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  to, 1, pLevel->p
2f700 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  2);.      }.#end
2f710 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53  if /* SQLITE_DIS
2f720 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2f730 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20  ISTINCT */.     
2f740 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
2f750 61 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20  ase: Advance to 
2f760 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  the next row */.
2f770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f780 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2f790 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2f7a0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2f7b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70  3VdbeAddOp3(v, p
2f7c0 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
2f7d0 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
2f7e0 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a  2, pLevel->p3);.
2f7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f800 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
2f810 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20  vel->p5);.      
2f820 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f830 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2f840 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2f850 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20  >op==OP_Next);. 
2f860 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f870 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2f880 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20  p==OP_Prev);.   
2f890 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2f8a0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2f8b0 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e  =OP_VNext);.#ifn
2f8c0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2f8d0 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2f8e0 54 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20  TINCT.      if( 
2f8f0 61 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74  addrSeek ) sqlit
2f900 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2f910 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e  , addrSeek);.#en
2f920 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2f930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f940 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f950 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2f960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f970 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2f980 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
2f990 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
2f9a0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
2f9b0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
2f9c0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
2f9d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f9e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2f9f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
2fa00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
2fa10 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
2fa20 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
2fa30 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
2fa40 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
2fa50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2fa60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2fa70 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2fa80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
2fa90 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2faa0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
2fab0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e         if( pIn->
2fac0 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20  nPrefix ){.     
2fad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2fae0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2faf0 57 48 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55  WHERE_IN_EARLYOU
2fb00 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
2fb10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb20 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f  p4Int(v, OP_IfNo
2fb30 48 6f 70 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  Hope, pLevel->iI
2fb40 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fb70 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
2fb80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fba0 70 49 6e 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d  pIn->iBase, pIn-
2fbb0 3e 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20  >nPrefix);.     
2fbc0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2fbd0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2fbe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2fbf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fc00 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
2fc10 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
2fc20 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
2fc30 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2fc40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2fc50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2fc60 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
2fc70 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29  LoopOp==OP_Prev)
2fc80 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2fc90 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2fca0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2fcb0 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  P_Next);.       
2fcc0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2fcd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2fce0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2fcf0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
2fd00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2fd10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2fd20 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2fd30 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
2fd40 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a  el->addrSkip ){.
2fd50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fd60 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
2fd70 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
2fd80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2fd90 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61  , "next skip-sca
2fda0 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d  n on %s", pLoop-
2fdb0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
2fdc0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2fdd0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2fde0 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2fdf0 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2fe00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2fe10 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2fe20 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20  ddrSkip-2);.    
2fe30 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2fe40 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
2fe50 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28  CH_BLOBS.    if(
2fe60 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
2fe70 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71  eRep ){.      sq
2fe80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fe90 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
2fea0 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c  ro, (int)(pLevel
2feb0 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e  ->iLikeRepCntr>>
2fec0 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1),.            
2fed0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76              pLev
2fee0 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29  el->addrLikeRep)
2fef0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2ff00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23  rage(v);.    }.#
2ff10 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c  endif.    if( pL
2ff20 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
2ff30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
2ff40 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
2ff50 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
2ff60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2ff70 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
2ff80 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
2ff90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2ffa0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ffb0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
2ffc0 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73  _ONLY)==0 || (ws
2ffd0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2ffe0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
2fff0 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  ( (ws & WHERE_ID
30000 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
30010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
30020 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70  evel->iTabCur==p
30030 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
30040 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
30050 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
30060 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
30070 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
30080 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
30090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
300a0 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
300b0 44 45 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c  DEXED) .       |
300c0 7c 20 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d  | ((ws & WHERE_M
300d0 55 4c 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76  ULTI_OR) && pLev
300e0 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a  el->u.pCovidx) .
300f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30110 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
30120 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
30130 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
30140 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
30150 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
30160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30170 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
30180 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
30190 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
301a0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
301b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
301c0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c  e3VdbeGoto(v, pL
301d0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
301e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
301f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
30200 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
30210 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75    }.    VdbeModu
30220 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
30230 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a  nd WHERE-loop%d:
30240 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20   %s", i,.       
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
30260 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
30270 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
30280 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  .pTab->zName));.
30290 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
302a0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
302b0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
302c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
302d0 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
302e0 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
302f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
30300 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
30310 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73  >iBreak);..  ass
30320 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
30330 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel<=pTabList->n
30340 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
30350 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
30360 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
30370 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
30380 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c  l++){.    int k,
30390 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f   last;.    VdbeO
303a0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65  p *pOp;.    Inde
303b0 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
303c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
303d0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
303e0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
303f0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
30400 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
30410 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
30420 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
30430 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  !=0 );.    pLoop
30440 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
30450 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  p;..    /* For a
30460 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61   co-routine, cha
30470 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d  nge all OP_Colum
30480 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  n references to 
30490 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
304a0 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   ** the co-routi
304b0 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20  ne into OP_Copy 
304c0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  of result contai
304d0 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  ned in a registe
304e0 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77  r..    ** OP_Row
304f0 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75  id becomes OP_Nu
30500 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
30510 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
30520 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
30530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30540 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
30550 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
30560 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
30570 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20  nToCopy(pParse, 
30580 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
30590 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
305a0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
305c0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
305d0 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  lt, 0);.      co
305e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 23  ntinue;.    }..#
305f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
30600 42 4c 45 5f 45 41 52 4c 59 5f 43 55 52 53 4f 52  BLE_EARLY_CURSOR
30610 5f 43 4c 4f 53 45 0a 20 20 20 20 2f 2a 20 43 6c  _CLOSE.    /* Cl
30620 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
30630 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
30640 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
30650 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
30660 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
30670 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72  not close cursor
30680 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
30690 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20  eused by the OR 
306a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
306b0 20 2a 2a 20 28 57 48 45 52 45 5f 4f 52 5f 53 55   ** (WHERE_OR_SU
306c0 42 43 4c 41 55 53 45 29 2e 20 20 41 6e 64 20 64  BCLAUSE).  And d
306d0 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20  o not close the 
306e0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72  OP_OpenWrite cur
306f0 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61  sors.    ** crea
30700 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50  ted for the ONEP
30710 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
30720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30730 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
30740 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
30750 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
30760 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
30770 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
30780 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30790 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
307a0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
307b0 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
307c0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
307d0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
307e0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
307f0 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
30800 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
30810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30820 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
30830 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
30840 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
30850 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
30860 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
30870 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
30880 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
30890 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
308a0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
308b0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
308c0 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
308d0 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
308e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
308f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30900 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
30910 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
30920 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
30930 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
30940 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
30950 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f  ex, make VDBE co
30960 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
30970 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
30980 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
30990 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66  dex instead of f
309a0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68  rom the table wh
309b0 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  ere possible.  I
309c0 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20  n some cases.   
309d0 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a   ** this optimiz
309e0 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74  ation prevents t
309f0 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76  he table from ev
30a00 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77  er being read, w
30a10 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20  hich can.    ** 
30a20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63  yield a signific
30a30 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ant performance 
30a40 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20  boost..    ** . 
30a50 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
30a60 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
30a70 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
30a80 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
30a90 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
30aa0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
30ab0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
30ac0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
30ad0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
30ae0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
30af0 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
30b00 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
30b10 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
30b20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
30b30 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
30b40 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
30b50 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
30b60 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
30b70 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
30b80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
30b90 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
30ba0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
30bb0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
30bc0 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
30bd0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
30be0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  dex;.    }else i
30bf0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
30c00 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
30c10 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
30c20 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
30c30 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
30c40 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26 26  if( pIdx.     &&
30c50 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61   (pWInfo->eOnePa
30c60 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
30c70 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 64  || !HasRowid(pId
30c80 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20  x->pTable)).    
30c90 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
30ca0 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20  ailed.    ){.   
30cb0 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
30cc0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
30cd0 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70  (v);.      k = p
30ce0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b  Level->addrBody;
30cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
30d00 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 64  EBUG.      if( d
30d10 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
30d20 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
30d30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
30d40 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20 6f 70  tf("TRANSLATE op
30d50 63 6f 64 65 73 20 69 6e 20 72 61 6e 67 65 20 25  codes in range %
30d60 64 2e 2e 25 64 5c 6e 22 2c 20 6b 2c 20 6c 61 73  d..%d\n", k, las
30d70 74 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  t-1);.      }.#e
30d80 6e 64 69 66 0a 20 20 20 20 20 20 70 4f 70 20 3d  ndif.      pOp =
30d90 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
30da0 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
30db0 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
30dc0 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
30dd0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
30de0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
30df0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30e00 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
30e10 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a 23 69  de==OP_Column.#i
30e20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30e30 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
30e40 4e 43 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  NC.         || p
30e50 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  Op->opcode==OP_O
30e60 66 66 73 65 74 0a 23 65 6e 64 69 66 0a 20 20 20  ffset.#endif.   
30e70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30e80 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70    int x = pOp->p
30e90 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  2;.          ass
30ea0 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c  ert( pIdx->pTabl
30eb0 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  e==pTab );.     
30ec0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
30ed0 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
30ee0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
30ef0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
30f00 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
30f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
30f20 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
30f30 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [x];.           
30f40 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
30f50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30f60 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74         x = sqlit
30f70 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
30f80 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20  pIdx, x);.      
30f90 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
30fa0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
30fb0 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  >p2 = x;.       
30fc0 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
30fd0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
30fe0 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f              Opco
30ff0 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28 64  deRewriteTrace(d
31000 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20  b, k, pOp);.    
31010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31020 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
31030 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
31040 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c  E_IDX_ONLY)==0 |
31050 7c 20 78 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  | x>=0 .        
31060 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
31070 3e 65 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20 20  >eOnePass );.   
31080 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
31090 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
310a0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
310b0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
310c0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
310d0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
310e0 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
310f0 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f  ;.          Opco
31100 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28 64  deRewriteTrace(d
31110 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20  b, k, pOp);.    
31120 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
31130 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66  p->opcode==OP_If
31140 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  NullRow ){.     
31150 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
31160 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
31170 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
31180 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
31190 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
311a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
311b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
311c0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c        if( db->fl
311d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
311e0 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 70 72  eAddopTrace ) pr
311f0 69 6e 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20  intf("TRANSLATE 
31200 63 6f 6d 70 6c 65 74 65 5c 6e 22 29 3b 0a 23 65  complete\n");.#e
31210 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
31220 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
31230 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
31240 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
31250 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
31260 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
31270 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
31280 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
31290 0a                                               .