/ Hex Artifact Content
Login

Artifact 03125c703ae26ae6ec32bc2e5563b38e41082c120d6d6e526c5f0174ce1cbd93:


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 54 68 69 73 20 69 73 20 77 68 65  *.** This is whe
29f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 20 66 6f 72  reScanInit() for
2a00: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 6e 20   the case of an 
2a10: 69 6e 64 65 78 20 6f 6e 20 61 6e 20 65 78 70 72  index on an expr
2a20: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 74 20 69 73  ession..** It is
2a30: 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
2a40: 74 6f 20 61 20 73 65 70 61 72 61 74 65 20 74 61  to a separate ta
2a50: 69 6c 2d 72 65 63 75 72 73 69 6f 6e 20 73 75 62  il-recursion sub
2a60: 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a  routine so that.
2a70: 2a 2a 20 74 68 65 20 6e 6f 72 6d 61 6c 20 77 68  ** the normal wh
2a80: 65 72 65 53 63 61 6e 49 6e 69 74 28 29 20 72 6f  ereScanInit() ro
2a90: 75 74 69 6e 65 2c 20 77 68 69 63 68 20 69 73 20  utine, which is 
2aa0: 61 20 68 69 67 68 2d 72 75 6e 6e 65 72 2c 20 64  a high-runner, d
2ab0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20  oes not.** need 
2ac0: 74 6f 20 70 75 73 68 20 72 65 67 69 73 74 65 72  to push register
2ad0: 73 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  s onto the stack
2ae0: 20 61 73 20 70 61 72 74 20 6f 66 20 69 74 73 20   as part of its 
2af0: 70 72 6f 6c 6f 67 75 65 2e 0a 2a 2f 0a 73 74 61  prologue..*/.sta
2b00: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
2b10: 49 4e 45 20 57 68 65 72 65 54 65 72 6d 20 2a 77  INE WhereTerm *w
2b20: 68 65 72 65 53 63 61 6e 49 6e 69 74 49 6e 64 65  hereScanInitInde
2b30: 78 45 78 70 72 28 57 68 65 72 65 53 63 61 6e 20  xExpr(WhereScan 
2b40: 2a 70 53 63 61 6e 29 7b 0a 20 20 70 53 63 61 6e  *pScan){.  pScan
2b50: 2d 3e 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  ->idxaff = sqlit
2b60: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2b70: 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 29 3b  Scan->pIdxExpr);
2b80: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2b90: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2bb0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
2bc0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2bd0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2be0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2bf0: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2c00: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2c10: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2c30: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2c40: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2c50: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2c60: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
2c70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2c80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2c90: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
2ca0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
2cb0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
2cc0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2cd0: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2ce0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2cf0: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2d00: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2d10: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2d20: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2d30: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2d40: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2d50: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2d60: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
2d70: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
2d80: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
2d90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2da0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
2db0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
2dc0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2dd0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2de0: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2df0: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2e00: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2e10: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2e20: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2e30: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2e40: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2e50: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2e60: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
2e70: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
2e80: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
2e90: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
2ea0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
2eb0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
2ec0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2ed0: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2ee0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2ef0: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2f00: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2f10: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2f20: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2f30: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2f40: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2f50: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2f60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2f70: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
2f80: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2fa0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2fd0: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2fe0: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2ff0: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
3000: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
3010: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
3020: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
3030: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
3040: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
3050: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
3060: 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72  .){.  pScan->pOr
3070: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
3080: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
3090: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
30a0: 72 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  r = 0;.  pScan->
30b0: 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 70 53  idxaff = 0;.  pS
30c0: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
30d0: 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d   0;.  pScan->opM
30e0: 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20  ask = opMask;.  
30f0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20  pScan->k = 0;.  
3100: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20  pScan->aiCur[0] 
3110: 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d  = iCur;.  pScan-
3120: 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70  >nEquiv = 1;.  p
3130: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31  Scan->iEquiv = 1
3140: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a  ;.  if( pIdx ){.
3150: 20 20 20 20 69 6e 74 20 6a 20 3d 20 69 43 6f 6c      int j = iCol
3160: 75 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  umn;.    iColumn
3170: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
3180: 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43  n[j];.    if( iC
3190: 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29  olumn==XN_EXPR )
31a0: 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70  {.      pScan->p
31b0: 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  IdxExpr = pIdx->
31c0: 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
31d0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 53 63 61  Expr;.      pSca
31e0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70  n->zCollName = p
31f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  Idx->azColl[j];.
3200: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
3210: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 58 4e 5f 45 58  olumn[0] = XN_EX
3220: 50 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PR;.      return
3230: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 49 6e   whereScanInitIn
3240: 64 65 78 45 78 70 72 28 70 53 63 61 6e 29 3b 0a  dexExpr(pScan);.
3250: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
3260: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61  olumn==pIdx->pTa
3270: 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  ble->iPKey ){.  
3280: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e      iColumn = XN
3290: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73  _ROWID;.    }els
32a0: 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30  e if( iColumn>=0
32b0: 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d   ){.      pScan-
32c0: 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e  >idxaff = pIdx->
32d0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
32e0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
32f0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f        pScan->zCo
3300: 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61  llName = pIdx->a
3310: 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a  zColl[j];.    }.
3320: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
3330: 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  umn==XN_EXPR ){.
3340: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3350: 7d 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c  }.  pScan->aiCol
3360: 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75 6d 6e  umn[0] = iColumn
3370: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
3380: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
3390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
33a0: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
33b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
33c0: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
33d0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
33e0: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
33f0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
3400: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
3410: 74 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66  table iCur or of
3420: 20 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69   index pIdx.** i
3430: 66 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f  f pIdx!=0 and <o
3440: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  p> is one of the
3450: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
3460: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
3470: 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72  by.** the op par
3480: 61 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20  ameter.  Return 
3490: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34a0: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
34b0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
34c0: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
34d0: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
34e0: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
34f0: 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  es of table iCur
3500: 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  .  .** Search fo
3510: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  r terms matching
3520: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
3530: 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a  column of pIdx.*
3540: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
3550: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
3560: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
3570: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  r..**.** The ter
3580: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
3590: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
35a0: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
35b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
35c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
35d0: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
35e0: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
35f0: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
3600: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
3610: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
3620: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
3630: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
3640: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
3650: 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c  ** aiCur[]/iaCol
3660: 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c  umn[] arrays hol
3670: 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  d X and all its 
3680: 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65  equivalents. The
3690: 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f  re are 11.** slo
36a0: 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69  ts in aiCur[]/ai
36b0: 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74  Column[] so that
36c0: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
36d0: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
36e0: 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20   to 10.** other 
36f0: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
3700: 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72  s.  Hence a sear
3710: 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65  ch for X will re
3720: 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58  turn <expr> if X
3730: 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32  =A1.** and A1=A2
3740: 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e   and A2=A3 and .
3750: 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e  .. and A9=A10 an
3760: 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a  d A10=<expr>..**
3770: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
3780: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
3790: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
37a0: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
37b0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
37c0: 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20  ** then try for 
37d0: 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20  the one with no 
37e0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
37f0: 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65  <expr> - in othe
3800: 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a  r words where.**
3810: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e   <expr> is a con
3820: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
3830: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
3840: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72  Only return entr
3850: 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ies of.** the fo
3860: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
3870: 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d  ere Y is a colum
3880: 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62  n in another tab
3890: 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f  le if no terms o
38a0: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
38b0: 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70   <op> <const-exp
38c0: 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20  r>" exist.   If 
38d0: 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20  no terms with a 
38e0: 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20  constant RHS.** 
38f0: 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65  exist, try to re
3900: 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74  turn a term that
3910: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f   does not use WO
3920: 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65  _EQUIV..*/.Where
3930: 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65  Term *sqlite3Whe
3940: 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68  reFindTerm(.  Wh
3950: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3960: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3970: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
3980: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
3990: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
39a0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
39b0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
39c0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
39d0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
39e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
39f0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
3a00: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
3a10: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
3a20: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
3a30: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
3a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
3a50: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
3a60: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
3a70: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
3a80: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
3a90: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3aa0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3ab0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
3ac0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
3ad0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
3ae0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
3af0: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
3b00: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
3b10: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
3b20: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
3b30: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
3b40: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57  .  op &= WO_EQ|W
3b50: 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70  O_IS;.  while( p
3b60: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
3b70: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
3b80: 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
3b90: 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65      if( p->prere
3ba0: 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d  qRight==0 && (p-
3bb0: 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d  >eOperator&op)!=
3bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
3bd0: 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61  tcase( p->eOpera
3be0: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
3bf0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b         return p;
3c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3c10: 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( pResult==0 ) 
3c20: 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20  pResult = p;.   
3c30: 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65   }.    p = where
3c40: 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b  ScanNext(&scan);
3c50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
3c60: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  esult;.}../*.** 
3c70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
3c80: 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
3c90: 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d   an entry that m
3ca0: 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
3cb0: 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
3cc0: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
3cd0: 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
3ce0: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
3cf0: 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
3d00: 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
3d10: 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
3d20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3d30: 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
3d40: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
3d50: 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
3d60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d80: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3d90: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3da0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3dc0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
3dd0: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
3de0: 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3e00: 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
3e10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
3e20: 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
3e30: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
3e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3e50: 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
3e60: 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
3e70: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
3e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
3e90: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
3ea0: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
3eb0: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
3ec0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
3ed0: 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
3ee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
3ef0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3f00: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3f10: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3f20: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
3f30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
3f40: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
3f50: 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
3f60: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
3f70: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
3f80: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
3f90: 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
3fa0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3fb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
3fc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
3fd0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3fe0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  r);.      if( 0=
3ff0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
4000: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
4010: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
4020: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
4030: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
4040: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
4050: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4060: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
4070: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
4080: 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a  dx is NOT NULL.*
4090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
40a0: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
40b0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
40c0: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b   iCol){.  int j;
40d0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
40e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
40f0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
4100: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
4110: 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  .  j = pIdx->aiC
4120: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69  olumn[iCol];.  i
4130: 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 72  f( j>=0 ){.    r
4140: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
4150: 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
4160: 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ull;.  }else if(
4170: 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   j==(-1) ){.    
4180: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
4190: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  e{.    assert( j
41a0: 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20 72 65  ==(-2) );.    re
41b0: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73 73 75  turn 0;  /* Assu
41c0: 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20 65 78  me an indexed ex
41d0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61 6c 77  pression can alw
41e0: 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55 4c 4c  ays yield a NULL
41f0: 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   */..  }.}../*.*
4200: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4210: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
4220: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
4230: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
4240: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
4250: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
4260: 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
4270: 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
4280: 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f 66 20  f any subset of 
4290: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
42a0: 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6c  he.** DISTINCT l
42b0: 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63 74 69  ist are collecti
42c0: 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e 64 20  vely unique and 
42d0: 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e 6f 6e  individually non
42e0: 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
42f0: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
4300: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
4310: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4320: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
4330: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
4340: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4350: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
4360: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4370: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4380: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
4390: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
43a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
43b0: 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
43c0: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
43d0: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
43e0: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
43f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
4400: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
4410: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
4430: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
4440: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
4450: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
4460: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
4470: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
4480: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
4490: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
44a0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
44b0: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
44c0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
44d0: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
44e0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
44f0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
4500: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
4510: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
4520: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
4530: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
4540: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
4550: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
4560: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
4570: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
4580: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
4590: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
45a0: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
45b0: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
45c0: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
45d0: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
45e0: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
45f0: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
4600: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
4610: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
4620: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
4630: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
4640: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
4650: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
4660: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
4670: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
4680: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
4690: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
46a0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
46b0: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
46c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
46d0: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
46e0: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
46f0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
4700: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
4710: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
4720: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
4730: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
4740: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
4750: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
4760: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
4770: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
4780: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
4790: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
47a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
47b0: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
47c0: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
47d0: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
47e0: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
47f0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
4800: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
4810: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
4820: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
4830: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
4840: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
4850: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
4860: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
4870: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
4880: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
4890: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
48a0: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
48b0: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
48c0: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
48d0: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
48e0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
48f0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
4900: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
4910: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
4920: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
4930: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
4940: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
4950: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
4960: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
4970: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
4980: 29 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e  ){.    if( !IsUn
4990: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
49a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
49b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
49c0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
49d0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
49e0: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
49f0: 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 2c  m(pWC, iBase, i,
4a00: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
4a10: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
4a20: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 49 6e        if( findIn
4a30: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
4a40: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
4a50: 20 70 49 64 78 2c 20 69 29 3c 30 20 29 20 62 72   pIdx, i)<0 ) br
4a60: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
4a70: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
4a80: 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d 3d 30 20  ull(pIdx, i)==0 
4a90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4ab0: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
4ac0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
4ad0: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
4ae0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
4af0: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
4b00: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
4b10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4b20: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4b30: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
4b40: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
4b50: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
4b60: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
4b70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
4b80: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
4b90: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
4ba0: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
4bb0: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
4bd0: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  t OP_Column opco
4be0: 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69  des to OP_Copy i
4bf0: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  n previously gen
4c00: 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a  erated code..**.
4c10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4c20: 72 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61  runs over genera
4c30: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e  ted VDBE code an
4c40: 64 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f  d translates OP_
4c50: 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65  Column.** opcode
4c60: 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 77  s into OP_Copy w
4c70: 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73  hen the table is
4c80: 20 62 65 69 6e 67 20 61 63 63 65 73 73 65 64 20   being accessed 
4c90: 76 69 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 0a  via co-routine .
4ca0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  ** instead of vi
4cb0: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a  a table lookup..
4cc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 41 75  **.** If the iAu
4cd0: 74 6f 69 64 78 43 75 72 20 69 73 20 6e 6f 74 20  toidxCur is not 
4ce0: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 4f  zero, then any O
4cf0: 50 5f 52 6f 77 69 64 20 69 6e 73 74 72 75 63 74  P_Rowid instruct
4d00: 69 6f 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f  ions on.** curso
4d10: 72 20 69 54 61 62 43 75 72 20 61 72 65 20 74 72  r iTabCur are tr
4d20: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f  ansformed into O
4d30: 50 5f 53 65 71 75 65 6e 63 65 20 6f 70 63 6f 64  P_Sequence opcod
4d40: 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 41 75  e for the.** iAu
4d50: 74 6f 69 64 78 43 75 72 20 63 75 72 73 6f 72 2c  toidxCur cursor,
4d60: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e   in order to gen
4d70: 65 72 61 74 65 20 75 6e 69 71 75 65 20 72 6f 77  erate unique row
4d80: 69 64 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 61  ids for the.** a
4d90: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 62  utomatic index b
4da0: 65 69 6e 67 20 67 65 6e 65 72 61 74 65 64 2e 0a  eing generated..
4db0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
4dc0: 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
4dd0: 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70  Copy(.  Parse *p
4de0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4df0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4e00: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
4e10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
4e20: 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f  late from this o
4e30: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64  pcode to the end
4e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
4e50: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f  r,        /* OP_
4e60: 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20  Column/OP_Rowid 
4e70: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
4e80: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
4e90: 74 20 69 52 65 67 69 73 74 65 72 2c 20 20 20 20  t iRegister,    
4ea0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
4eb0: 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73  olumn is in this
4ec0: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
4ed0: 6e 74 20 69 41 75 74 6f 69 64 78 43 75 72 20 20  nt iAutoidxCur  
4ee0: 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
4ef0: 6f 2c 20 63 75 72 73 6f 72 20 6f 66 20 61 75 74  o, cursor of aut
4f00: 6f 69 6e 64 65 78 20 62 65 69 6e 67 20 67 65 6e  oindex being gen
4f10: 65 72 61 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56  erated */.){.  V
4f20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
4f30: 3e 70 56 64 62 65 3b 0a 20 20 56 64 62 65 4f 70  >pVdbe;.  VdbeOp
4f40: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
4f50: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
4f60: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
4f70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
4f80: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
4f90: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4fb0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 69 53  turn;.  for(; iS
4fc0: 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72  tart<iEnd; iStar
4fd0: 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  t++, pOp++){.   
4fe0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54   if( pOp->p1!=iT
4ff0: 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
5000: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
5010: 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
5020: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f   ){.      pOp->o
5030: 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b  pcode = OP_Copy;
5040: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  .      pOp->p1 =
5050: 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69   pOp->p2 + iRegi
5060: 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ster;.      pOp-
5070: 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  >p2 = pOp->p3;. 
5080: 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30       pOp->p3 = 0
5090: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
50a0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
50b0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Rowid ){.      i
50c0: 66 28 20 69 41 75 74 6f 69 64 78 43 75 72 20 29  f( iAutoidxCur )
50d0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  {.        pOp->o
50e0: 70 63 6f 64 65 20 3d 20 4f 50 5f 53 65 71 75 65  pcode = OP_Seque
50f0: 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  nce;.        pOp
5100: 2d 3e 70 31 20 3d 20 69 41 75 74 6f 69 64 78 43  ->p1 = iAutoidxC
5110: 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ur;.      }else{
5120: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
5130: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
5140: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
5150: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
5160: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
5170: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
5180: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
5190: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
51a0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
51b0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
51c0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
51d0: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
51e0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
51f0: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
5200: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
5210: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
5220: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
5230: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
5240: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
5250: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
5260: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
5270: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
5280: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
5290: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
52a0: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
52b0: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
52c0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
52d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
52e0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
52f0: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5300: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5310: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5320: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5330: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
5340: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
5350: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
5360: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
5370: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
5380: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
5390: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
53a0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
53b0: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
53c0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
53d0: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
53e0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
53f0: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
5400: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
5410: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
5420: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5430: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
5440: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
5450: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
5460: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
5470: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
5480: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
5490: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
54a0: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
54b0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
54c0: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
54d0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
54e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
54f0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5500: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5510: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5520: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5530: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5540: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
5550: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
5560: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
5570: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
5580: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
5590: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
55a0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
55b0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
55c0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
55d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
55e0: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
55f0: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
5600: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5610: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
5620: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
5630: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5640: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
5650: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
5660: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
5670: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5680: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5690: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
56a0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
56b0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
56c0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
56d0: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
56e0: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
56f0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
5700: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
5710: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
5720: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
5730: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
5740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5750: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
5760: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
5770: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
5780: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
5790: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
57a0: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
57b0: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
57c0: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
57d0: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
57e0: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
57f0: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
5800: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
5810: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
5820: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5830: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
5840: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
5850: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
5860: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5870: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
5880: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
5890: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
58a0: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
58b0: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
58c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
58d0: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
58e0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
58f0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5900: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5910: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
5920: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
5930: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
5940: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
5950: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
5960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5970: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
5980: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20  pe & JT_LEFT) . 
5990: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
59a0: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
59b0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
59c0: 0a 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  .   && (pTerm->e
59d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
59e0: 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ).  ){.    /* Ca
59f0: 6e 6e 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74  nnot use an IS t
5a00: 65 72 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45  erm from the WHE
5a10: 52 45 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20  RE clause as an 
5a20: 69 6e 64 65 78 20 64 72 69 76 65 72 20 66 6f 72  index driver for
5a30: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
5a40: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
5a50: 53 75 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20  Such a term can 
5a60: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
5a70: 69 74 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a  it is from.    *
5a80: 2a 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  * the ON clause.
5a90: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
5aa0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54  0;.  }.  if( (pT
5ab0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5ac0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
5ad0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5ae0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
5af0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
5b00: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
5b10: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
5b20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5b30: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
5b40: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
5b50: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
5b60: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
5b70: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
5b80: 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
5b90: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
5ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5bb0: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
5bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
5bd0: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
5be0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5bf0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
5c00: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
5c10: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
5c20: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
5c30: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
5c40: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
5c50: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
5c60: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
5c70: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
5c80: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5c90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5ca0: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
5cb0: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
5cc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5cd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5ce0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5cf0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
5d00: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
5d10: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5d20: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
5d30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
5d40: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
5d50: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5d60: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
5d70: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
5d80: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
5d90: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
5da0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5db0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
5dc0: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
5dd0: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
5de0: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
5df0: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
5e00: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
5e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5e20: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5e30: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
5e40: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
5e50: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
5e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5e70: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
5e80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5e90: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
5ea0: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
5eb0: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
5ec0: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
5ed0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5ee0: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
5ef0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
5f00: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
5f10: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f30: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
5f40: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
5f50: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5f60: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
5f70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5f80: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
5f90: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
5fa0: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
5fb0: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
5fc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5fd0: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
5fe0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
5ff0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6000: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
6010: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
6020: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
6030: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
6040: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
6050: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
6060: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
6090: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
60a0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
60b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
60c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
60d0: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
60e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
60f0: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
6100: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
6110: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6130: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
6140: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
6150: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
6160: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
6170: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
6180: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
6190: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
61a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
61b0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
61c0: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
61d0: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
61e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
61f0: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
6200: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
6210: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
6220: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
6230: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
6240: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
6250: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
6260: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
6270: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
6280: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
6290: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
62a0: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
62b0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
62c0: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
62d0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
62e0: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
62f0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6300: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
6310: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  luded rows */.  
6320: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
6330: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
6340: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
6350: 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65  erm being indexe
6360: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  d */.  int addrC
6370: 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20  ounter = 0;     
6380: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68     /* Address wh
6390: 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e  ere integer coun
63a0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
63b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  ed */.  int regB
63c0: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
63d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
63e0: 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20  registers where 
63f0: 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62  record is assemb
6400: 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  led */..  /* Gen
6410: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
6420: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
6430: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
6440: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
6450: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
6460: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
6470: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
6480: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
6490: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
64a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
64b0: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
64c0: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
64d0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
64e0: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
64f0: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
6500: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6510: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
6520: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
6530: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
6540: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
6550: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
6560: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
6570: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
6580: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
6590: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
65a0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
65b0: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
65c0: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
65d0: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
65e0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
65f0: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
6600: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
6610: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
6620: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
6630: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6640: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
6650: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
6660: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
6670: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
6680: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
6690: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
66a0: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
66b0: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
66c0: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
66d0: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
66e0: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6700: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
6710: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
6720: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
6730: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
6740: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
6750: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
6760: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
6770: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6780: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
6790: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
67a0: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
67b0: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
67c0: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
67d0: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
67e0: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c  3ExprAnd(pParse,
67f0: 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20 20 20   pPartial,.     
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6820: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
6830: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 29  ->db, pExpr, 0))
6840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6850: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
6860: 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
6870: 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
6880: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
6890: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
68a0: 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
68b0: 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
68c0: 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
68d0: 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
68e0: 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
68f0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
6900: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6910: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
6920: 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74 57        if( !sentW
6930: 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  arning ){.      
6940: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
6950: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
6960: 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20  OINDEX,.        
6970: 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69      "automatic i
6980: 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c  ndex on %s(%s)",
6990: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
69b0: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  le->aCol[iCol].z
69c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
69d0: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a  entWarning = 1;.
69e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
69f0: 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
6a00: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
6a10: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
6a20: 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
6a30: 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c  , pLoop, nKeyCol
6a40: 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1) ){.         
6a50: 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69   goto end_auto_i
6a60: 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 20  ndex_create;.   
6a70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
6a80: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65  Loop->aLTerm[nKe
6a90: 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  yCol++] = pTerm;
6aa0: 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
6ab0: 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
6ac0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6ad0: 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30  ssert( nKeyCol>0
6ae0: 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
6af0: 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
6b00: 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43  ->nLTerm = nKeyC
6b10: 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ol;.  pLoop->wsF
6b20: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
6b30: 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
6b40: 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
6b50: 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
6b70: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
6b80: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
6b90: 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
6ba0: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
6bb0: 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
6bc0: 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
6bd0: 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
6be0: 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
6bf0: 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
6c00: 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
6c10: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
6c20: 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
6c30: 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
6c40: 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
6c50: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
6c60: 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
6c70: 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
6c80: 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
6c90: 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
6ca0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
6cb0: 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
6cc0: 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
6cd0: 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
6ce0: 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
6cf0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
6d00: 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
6d10: 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
6d20: 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
6d30: 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
6d40: 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
6d50: 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
6d60: 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
6d70: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
6d80: 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d  ;.  mxBitCol = M
6d90: 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d  IN(BMS-1,pTable-
6da0: 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61  >nCol);.  testca
6db0: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
6dc0: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
6dd0: 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
6de0: 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
6df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
6e00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
6e10: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
6e20: 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79  ASKBIT(i) ) nKey
6e30: 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Col++;.  }.  if(
6e40: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
6e50: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
6e60: 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b  ){.    nKeyCol +
6e70: 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
6e80: 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20   BMS + 1;.  }.. 
6e90: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
6ea0: 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  e Index object t
6eb0: 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  o describe this 
6ec0: 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20  index */.  pIdx 
6ed0: 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
6ee0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61  eIndexObject(pPa
6ef0: 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c  rse->db, nKeyCol
6f00: 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64  +1, 0, &zNotUsed
6f10: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
6f20: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f   ) goto end_auto
6f30: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
6f40: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
6f50: 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
6f60: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22   pIdx->zName = "
6f70: 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70  auto-index";.  p
6f80: 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
6f90: 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
6fa0: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
6fb0: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
6fc0: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
6fd0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
6fe0: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
6ff0: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
7000: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
7010: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
7020: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
7030: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
7040: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
7050: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
7060: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
7070: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
7080: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
7090: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
70a0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
70b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
70c0: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
70d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
70e0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
70f0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
7100: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
7110: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
7120: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
7130: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
7140: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
7150: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
7160: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
7170: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
7180: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
7190: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
71a0: 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  [n] = pColl ? pC
71b0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c  oll->zName : sql
71c0: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
71d0: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
71e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
71f0: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
7200: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
7210: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
7220: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
7230: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
7240: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
7250: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
7260: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
7270: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7280: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
7290: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
72a0: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
72b0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
72c0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
72d0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
72e0: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
72f0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
7300: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
7310: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
7320: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
7330: 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
7340: 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
7350: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7360: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
7370: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
7380: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
7390: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
73a0: 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  ARY;.      n++;.
73b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
73c0: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
73d0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
73e0: 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44  mn[n] = XN_ROWID
73f0: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
7400: 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [n] = sqlite3Str
7410: 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72  BINARY;..  /* Cr
7420: 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
7430: 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73  ic index */.  as
7440: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
7450: 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c  dxCur>=0 );.  pL
7460: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
7470: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
7480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7490: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op2(v, OP_OpenAu
74a0: 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
74b0: 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f  >iIdxCur, nKeyCo
74c0: 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  l+1);.  sqlite3V
74d0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
74e0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
74f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
7500: 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
7510: 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
7520: 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
7530: 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
7540: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 70 54 61  content */.  pTa
7550: 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57  bItem = &pWC->pW
7560: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
7570: 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
7580: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
7590: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
75a0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  e ){.    int reg
75b0: 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d  Yield = pTabItem
75c0: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
75d0: 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 73   addrCounter = s
75e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
75f0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7600: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7610: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7620: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
7630: 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70  , regYield, 0, p
7640: 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
7650: 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64 72 54  lSub);.    addrT
7660: 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  op =  sqlite3Vdb
7670: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
7680: 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  eld, regYield);.
7690: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
76a0: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
76b0: 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
76c0: 6f 77 20 6f 66 20 25 73 22 2c 20 70 54 61 62 49  ow of %s", pTabI
76d0: 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
76e0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
76f0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
7700: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
7710: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
7720: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
7730: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7740: 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  }.  if( pPartial
7750: 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75   ){.    iContinu
7760: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
7770: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
7780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7790: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
77a0: 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74   pPartial, iCont
77b0: 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  inue, SQLITE_JUM
77c0: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c  PIFNULL);.    pL
77d0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
77e0: 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58  WHERE_PARTIALIDX
77f0: 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72  ;.  }.  regRecor
7800: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
7810: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
7820: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
7830: 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
7840: 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ey(.      pParse
7850: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
7860: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
7870: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20  rd, 0, 0, 0, 0. 
7880: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
7890: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
78a0: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
78b0: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
78c0: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
78d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
78e0: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
78f0: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
7900: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
7910: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7920: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
7930: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
7940: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
7950: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7960: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
7970: 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65  Counter, regBase
7980: 2b 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +n);.    testcas
7990: 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  e( pParse->db->m
79a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
79b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
79c0: 6c 2d 3e 69 49 64 78 43 75 72 3e 30 20 29 3b 0a  l->iIdxCur>0 );.
79d0: 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
79e0: 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65  umnToCopy(pParse
79f0: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
7a00: 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20  l->iTabCur,.    
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
7a30: 72 65 67 52 65 73 75 6c 74 2c 20 70 4c 65 76 65  regResult, pLeve
7a40: 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
7a50: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
7a60: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
7a70: 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76    pTabItem->fg.v
7a80: 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b  iaCoroutine = 0;
7a90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ab0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
7ac0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
7ad0: 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rTop+1); VdbeCov
7ae0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7af0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7b00: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
7b10: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
7b20: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
7b30: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7b40: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
7b50: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7b60: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
7b70: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
7b80: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
7b90: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
7ba0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
7bb0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7bc0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
7bd0: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
7be0: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
7bf0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7c00: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
7c10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7c20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
7c30: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
7c40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7c50: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
7c60: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
7c70: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
7c80: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7c90: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
7ca0: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
7cb0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
7cc0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
7cd0: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
7ce0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
7cf0: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
7d00: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
7d10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
7d20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
7d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
7d40: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
7d50: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
7d60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7d70: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7d80: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
7d90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7da0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7dc0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7dd0: 75 73 65 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  use being analyz
7de0: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
7df0: 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20  mUnusable,      
7e00: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
7e10: 65 20 74 65 72 6d 73 20 77 69 74 68 20 74 68 65  e terms with the
7e20: 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20  se prereqs */.  
7e30: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7e40: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
7e50: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7e60: 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
7e70: 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 45 78  the vtab */.  Ex
7e80: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7ea0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
7eb0: 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 2a 70  ause */.  u16 *p
7ec0: 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20  mNoOmit         
7ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
7ee0: 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74  k of terms not t
7ef0: 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  o omit */.){.  i
7f00: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
7f10: 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
7f20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7f30: 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
7f40: 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
7f50: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7f60: 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
7f70: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7f80: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7f90: 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
7fa0: 0a 20 20 73 74 72 75 63 74 20 48 69 64 64 65 6e  .  struct Hidden
7fb0: 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64  IndexInfo *pHidd
7fc0: 65 6e 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  en;.  WhereTerm 
7fd0: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
7fe0: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
7ff0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
8000: 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e  dxInfo;.  u16 mN
8010: 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oOmit = 0;..  /*
8020: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
8030: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
8040: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
8050: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
8060: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
8070: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
8080: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
8090: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
80a0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
80b0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
80c0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
80d0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
80e0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
80f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
8100: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
8110: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
8120: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
8130: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
8140: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8150: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
8160: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8170: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8180: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
8190: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
81a0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
81b0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
81c0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
81d0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
81e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
81f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8200: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
8210: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8220: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55  rator & ~(WO_EQU
8230: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
8240: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
8250: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8260: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
8270: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8280: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
8290: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
82a0: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
82b0: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
82c0: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
82d0: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
82e0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
82f0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
8300: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
8310: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
8320: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
8330: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
8340: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
8350: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
8360: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
8370: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
8380: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
8390: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
83a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
83b0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
83c0: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
83d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
83e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
83f0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
8400: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
8410: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
8420: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8430: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
8440: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
8450: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
8460: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
8470: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
8480: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
8490: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
84a0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
84b0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
84c0: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
84f0: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
8500: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
8510: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
8540: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
8550: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 69 64 64   + sizeof(*pHidd
8560: 65 6e 29 20 29 3b 0a 20 20 69 66 28 20 70 49 64  en) );.  if( pId
8570: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
8580: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8590: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
85a0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
85b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
85c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
85d0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
85e0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
85f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
8600: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
8610: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
8620: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
8630: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
8640: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
8650: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
8660: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
8670: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
8680: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
8690: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
86a0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
86b0: 2f 0a 20 20 70 48 69 64 64 65 6e 20 3d 20 28 73  /.  pHidden = (s
86c0: 74 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65  truct HiddenInde
86d0: 78 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f  xInfo*)&pIdxInfo
86e0: 5b 31 5d 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  [1];.  pIdxCons 
86f0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
8700: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8710: 6e 74 2a 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b  nt*)&pHidden[1];
8720: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
8730: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
8740: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
8750: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
8760: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
8770: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8780: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
8790: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
87a0: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
87b0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
87c0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
87d0: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
87e0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
87f0: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
8800: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8810: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8820: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
8830: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
8840: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
8850: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
8860: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
8870: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
8880: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
8890: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
88a0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
88b0: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
88c0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
88d0: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
8920: 65 3b 0a 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70  e;..  pHidden->p
8930: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 48 69 64  WC = pWC;.  pHid
8940: 64 65 6e 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  den->pParse = pP
8950: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  arse;.  for(i=j=
8960: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
8970: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
8980: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
8990: 20 20 75 31 36 20 6f 70 3b 0a 20 20 20 20 69 66    u16 op;.    if
89a0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
89b0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
89c0: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
89d0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
89e0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
89f0: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
8a00: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8a10: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
8a20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8a30: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
8a40: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8a50: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8a60: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
8a70: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8a80: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
8a90: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8aa0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8ab0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
8ac0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8ad0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8ae0: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
8af0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8b00: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49  ator & ~(WO_EQUI
8b10: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
8b20: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
8b30: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8b40: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
8b50: 65 3b 0a 20 20 20 20 69 66 28 20 28 70 53 72 63  e;.    if( (pSrc
8b60: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
8b70: 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20  JT_LEFT)!=0.    
8b80: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
8b90: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
8ba0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
8bb0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
8bc0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8bd0: 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 0a 20  IS|WO_ISNULL)). 
8be0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41     ){.      /* A
8bf0: 6e 20 22 49 53 22 20 74 65 72 6d 20 69 6e 20 74  n "IS" term in t
8c00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
8c10: 77 68 65 72 65 20 74 68 65 20 76 69 72 74 75 61  where the virtua
8c20: 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  l table is the r
8c30: 68 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  hs.      ** of a
8c40: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 44 6f 20 6e   LEFT JOIN. Do n
8c50: 6f 74 20 70 61 73 73 20 74 68 69 73 20 74 65 72  ot pass this ter
8c60: 6d 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  m to the virtual
8c70: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
8c80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
8c90: 61 73 20 74 68 69 73 20 63 61 6e 20 6c 65 61 64  as this can lead
8ca0: 20 74 6f 20 69 6e 63 6f 72 72 65 63 74 20 72 65   to incorrect re
8cb0: 73 75 6c 74 73 20 66 72 6f 6d 20 53 51 4c 20 73  sults from SQL s
8cc0: 75 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 73 3a  uch.      ** as:
8cd0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
8ce0: 2a 2a 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20  **   "LEFT JOIN 
8cf0: 76 74 61 62 20 57 48 45 52 45 20 76 74 61 62 2e  vtab WHERE vtab.
8d00: 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 20 2a 2f  col IS NULL"  */
8d10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8d20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8d30: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
8d40: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8d50: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8d60: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
8d70: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8d80: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
8d90: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8da0: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
8db0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
8dc0: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
8dd0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
8de0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
8df0: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
8e00: 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  op = pTerm->eOpe
8e10: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
8e20: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8e30: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8e40: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 41      if( op==WO_A
8e50: 55 58 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  UX ){.      pIdx
8e60: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65  Cons[j].op = pTe
8e70: 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20  rm->eMatchOp;.  
8e80: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 20 26    }else if( op &
8e90: 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
8ea0: 53 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  S) ){.      if( 
8eb0: 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  op==WO_ISNULL ){
8ec0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
8ed0: 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45  s[j].op = SQLITE
8ee0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8ef0: 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  T_ISNULL;.      
8f00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
8f10: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8f20: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8f30: 53 54 52 41 49 4e 54 5f 49 53 3b 0a 20 20 20 20  STRAINT_IS;.    
8f40: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8f50: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
8f60: 2e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  .op = (u8)op;.  
8f70: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
8f80: 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
8f90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
8fa0: 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
8fb0: 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ly because.     
8fc0: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
8fd0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8fe0: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
8ff0: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
9000: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
9010: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
9020: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
9030: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9040: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
9050: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9060: 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EQ );.      asse
9070: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
9080: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9090: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_LT );.      a
90a0: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
90b0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
90c0: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
90d0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
90e0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
90f0: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
9100: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
9110: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
9120: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
9130: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9140: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9150: 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f  &(WO_IN|WO_EQ|WO
9160: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
9170: 57 4f 5f 47 45 7c 57 4f 5f 41 55 58 29 20 29 3b  WO_GE|WO_AUX) );
9180: 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 26  ..      if( op &
9190: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f   (WO_LT|WO_LE|WO
91a0: 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20  _GT|WO_GE).     
91b0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
91c0: 49 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e  IsVector(pTerm->
91d0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a  pExpr->pRight) .
91e0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
91f0: 20 69 66 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f   if( i<16 ) mNoO
9200: 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b  mit |= (1 << i);
9210: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d  .        if( op=
9220: 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e  =WO_LT ) pIdxCon
9230: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b  s[j].op = WO_LE;
9240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d  .        if( op=
9250: 3d 57 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e  =WO_GT ) pIdxCon
9260: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b  s[j].op = WO_GE;
9270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9280: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
9290: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
92a0: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
92b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
92c0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
92d0: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
92e0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
92f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
9300: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
9310: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
9320: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
9330: 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f  r;.  }..  *pmNoO
9340: 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20  mit = mNoOmit;. 
9350: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
9360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
9370: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
9380: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
9390: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
93a0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
93b0: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
93c0: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
93d0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
93e0: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
93f0: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
9400: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
9410: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
9420: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
9430: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
9440: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
9450: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
9460: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
9470: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
9480: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9490: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
94a0: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
94b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
94c0: 61 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  an.** appropriat
94d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
94e0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 72 65 74  returned.  A ret
94f0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  urn of SQLITE_CO
9500: 4e 53 54 52 41 49 4e 54 20 66 72 6f 6d 0a 2a 2a  NSTRAINT from.**
9510: 20 78 42 65 73 74 49 6e 64 65 78 20 69 73 20 6e   xBestIndex is n
9520: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
9530: 20 65 72 72 6f 72 2e 20 20 53 51 4c 49 54 45 5f   error.  SQLITE_
9540: 43 4f 4e 53 54 52 41 49 4e 54 20 69 6e 64 69 63  CONSTRAINT indic
9550: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  ates that.** the
9560: 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75   current configu
9570: 72 61 74 69 6f 6e 20 6f 66 20 22 75 6e 75 73 61  ration of "unusa
9580: 62 6c 65 22 20 66 6c 61 67 73 20 69 6e 20 73 71  ble" flags in sq
9590: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
95a0: 20 63 61 6e 0a 2a 2a 20 6e 6f 74 20 72 65 73 75   can.** not resu
95b0: 6c 74 20 69 6e 20 61 20 76 61 6c 69 64 20 70 6c  lt in a valid pl
95c0: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  an..**.** Whethe
95d0: 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f  r or not an erro
95e0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  r is returned, i
95f0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
9600: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
9610: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
9620: 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69  tually free p->i
9630: 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64  dxStr if p->need
9640: 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64  ToFreeIdxStr ind
9650: 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74  icates.** that t
9660: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e  his is required.
9670: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
9680: 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72  tabBestIndex(Par
9690: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
96a0: 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33  e *pTab, sqlite3
96b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
96c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
96d0: 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
96e0: 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
96f0: 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74  ->db, pTab)->pVt
9700: 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ab;.  int rc;.. 
9710: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
9720: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
9730: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
9740: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
9750: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
9760: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
9770: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9780: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f  && rc!=SQLITE_CO
9790: 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
97a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
97b0: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
97c0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50  lite3OomFault(pP
97d0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  arse->db);.    }
97e0: 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
97f0: 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
9800: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9810: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
9820: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
9830: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
9840: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9850: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
9860: 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
9870: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
9880: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
9890: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
98a0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
98b0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
98c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
98d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
98e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
98f0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
9900: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
9910: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
9920: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
9930: 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
9940: 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
9950: 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
9960: 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
9970: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
9980: 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
9990: 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
99a0: 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
99b0: 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
99c0: 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61  han pRec.**    a
99d0: 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
99e0: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
99f0: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a   equal to pRec.*
9a00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9a10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d  index of the sam
9a20: 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20  ple that is the 
9a30: 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  smallest sample 
9a40: 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  that.** is great
9a50: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
9a60: 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74   to pRec. Note t
9a70: 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69  hat this index i
9a80: 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a  s not an index.*
9a90: 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70  * into the aSamp
9aa0: 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20  le[] array - it 
9ab0: 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f  is an index into
9ac0: 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f   a virtual set o
9ad0: 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73  f samples.** bas
9ae0: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
9af0: 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20  ts of aSample[] 
9b00: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
9b10: 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f  f fields in reco
9b20: 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f  rd .** pRec. .*/
9b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
9b40: 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
9b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
9b70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9b80: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
9b90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9ba0: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
9bb0: 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
9bc0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
9bd0: 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20  ord *pRec,      
9be0: 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61   /* Vector of va
9bf0: 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  lues to consider
9c00: 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
9c10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
9c20: 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
9c30: 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
9c40: 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
9c50: 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c70: 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
9c80: 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
9c90: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
9ca0: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
9cb0: 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  mple;.  int iCol
9cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9cd0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9ce0: 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69  required stats i
9cf0: 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f  n anEq[] etc. */
9d00: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d20: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
9d30: 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20   sample >= pRec 
9d40: 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65  */.  int iSample
9d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d60: 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
9d70: 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ple larger than 
9d80: 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
9d90: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d   */.  int iMin =
9da0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9db0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
9dc0: 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73  mple not yet tes
9dd0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ted */.  int iTe
9de0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9df0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
9e00: 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
9e10: 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e30: 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
9e40: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
9e50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
9e80: 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20  lds in pRec */. 
9e90: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20   tRowcnt iLower 
9ea0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
9eb0: 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20  anLt[] + anEq[] 
9ec0: 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c  of largest sampl
9ed0: 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a  e pRec is > */..
9ee0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9ef0: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
9f00: 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20  RAMETER( pParse 
9f10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
9f20: 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20  rt( pRec!=0 );. 
9f30: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9f40: 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
9f50: 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65  sert( pRec->nFie
9f60: 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46  ld>0 && pRec->nF
9f70: 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d  ield<=pIdx->nSam
9f80: 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20  pleCol );..  /* 
9f90: 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  Do a binary sear
9fa0: 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66  ch to find the f
9fb0: 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61  irst sample grea
9fc0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
9fd0: 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20  l.  ** to pRec. 
9fe0: 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
9ff0: 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c   a single field,
a000: 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70   the set of samp
a010: 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20  les to search.  
a020: 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65  ** is simply the
a030: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a040: 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73  . If the samples
a050: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f   in aSample[] co
a060: 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20  ntain more.  ** 
a070: 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c  than one fields,
a080: 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c   all fields foll
a090: 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  owing the first 
a0a0: 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a  are ignored..  *
a0b0: 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63  *.  ** If pRec c
a0c0: 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73  ontains N fields
a0d0: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72  , where N is mor
a0e0: 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e  e than one, then
a0f0: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a   as well as the.
a100: 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20    ** samples in 
a110: 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63  aSample[] (trunc
a120: 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73  ated to N fields
a130: 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61 6c  ), the search al
a140: 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63  so has to.  ** c
a150: 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65 73  onsider prefixes
a160: 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65   of those sample
a170: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a180: 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73 61  if the set of sa
a190: 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53  mples.  ** in aS
a1a0: 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20  ample is:.  **. 
a1b0: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a1c0: 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a  0] = (a, 5) .  *
a1d0: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d  *     aSample[1]
a1e0: 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a   = (a, 10) .  **
a1f0: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20       aSample[2] 
a200: 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (b, 5) .  **  
a210: 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20     aSample[3] = 
a220: 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20  (c, 100) .  **  
a230: 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20     aSample[4] = 
a240: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20  (c, 105).  **.  
a250: 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61 72  ** Then the sear
a260: 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20  ch space should 
a270: 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73  ideally be the s
a280: 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64  amples above and
a290: 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75   the .  ** uniqu
a2a0: 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20  e prefixes [a], 
a2b0: 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74  [b] and [c]. But
a2c0: 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20 68   since that is h
a2d0: 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c  ard to organize,
a2e0: 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20   .  ** the code 
a2f0: 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65  actually searche
a300: 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a  s this set:.  **
a310: 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29  .  **     0: (a)
a320: 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61   .  **     1: (a
a330: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32  , 5) .  **     2
a340: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
a350: 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a      3: (a, 10) .
a360: 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20    **     4: (b) 
a370: 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c  .  **     5: (b,
a380: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a   5) .  **     6:
a390: 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37   (c) .  **     7
a3a0: 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a  : (c, 100) .  **
a3b0: 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29       8: (c, 105)
a3c0: 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c  .  **     9: (c,
a3d0: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
a3e0: 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20  For each sample 
a3f0: 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
a400: 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65   array, N sample
a410: 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  s are present in
a420: 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74   the.  ** effect
a430: 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79  ive sample array
a440: 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  . In the above, 
a450: 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20  samples 0 and 1 
a460: 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20  are based on .  
a470: 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  ** sample aSampl
a480: 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20  e[0]. Samples 2 
a490: 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65  and 3 on aSample
a4a0: 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20  [1] etc..  **.  
a4b0: 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65  ** Often, sample
a4c0: 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b   i of each block
a4d0: 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65 20   of N effective 
a4e0: 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31  samples has (i+1
a4f0: 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45  ) fields..  ** E
a500: 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70  xcept, each samp
a510: 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64  le may be extend
a520: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
a530: 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72 20  t it is greater 
a540: 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75  than or.  ** equ
a550: 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  al to the previo
a560: 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  us sample in the
a570: 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d   array. For exam
a580: 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76  ple, in the abov
a590: 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20  e, .  ** sample 
a5a0: 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  2 is the first s
a5b0: 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b  ample of a block
a5c0: 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73   of N samples, s
a5d0: 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a 20  o at first it . 
a5e0: 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61 74   ** appears that
a5f0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20   it should be 1 
a600: 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48  field in size. H
a610: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75  owever, that wou
a620: 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a  ld make it .  **
a630: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61   smaller than sa
a640: 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62  mple 1, so the b
a650: 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f 75  inary search wou
a660: 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20  ld not work. As 
a670: 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20  a result, .  ** 
a680: 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20 74  it is extended t
a690: 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68  o two fields. Th
a6a0: 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 61  e duplicates tha
a6b0: 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20 64  t this creates d
a6c0: 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73  o not .  ** caus
a6d0: 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
a6e0: 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20    */.  nField = 
a6f0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  pRec->nField;.  
a700: 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d  iCol = 0;.  iSam
a710: 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  ple = pIdx->nSam
a720: 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20  ple * nField;.  
a730: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d  do{.    int iSam
a740: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a750: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
a760: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74  n aSample[] of t
a770: 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20  est sample */.  
a780: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
a7b0: 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70  lds in test samp
a7c0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74  le */..    iTest
a7d0: 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65   = (iMin+iSample
a7e0: 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d  )/2;.    iSamp =
a7f0: 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b   iTest / nField;
a800: 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30  .    if( iSamp>0
a810: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
a820: 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74   proposed effect
a830: 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20  ive sample is a 
a840: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
a850: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
a860: 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66  .      ** Specif
a870: 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72  ically, the shor
a880: 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 61  test prefix of a
a890: 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65  t least (1 + iTe
a8a0: 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20  st%nField) .    
a8b0: 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74    ** fields that
a8c0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
a8d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 66   the previous ef
a8e0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20  fective sample. 
a8f0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d   */.      for(n=
a900: 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29  (iTest % nField)
a910: 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20   + 1; n<nField; 
a920: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  n++){.        if
a930: 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d  ( aSample[iSamp-
a940: 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53  1].anLt[n-1]!=aS
a950: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
a960: 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a  t[n-1] ) break;.
a970: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a980: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65  e{.      n = iTe
a990: 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  st + 1;.    }.. 
a9a0: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
a9b0: 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73  = n;.    res = s
a9c0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a9d0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a9e0: 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c  iSamp].n, aSampl
a9f0: 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63  e[iSamp].p, pRec
aa00: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  );.    if( res<0
aa10: 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
aa20: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   = aSample[iSamp
aa30: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53  ].anLt[n-1] + aS
aa40: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45  ample[iSamp].anE
aa50: 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  q[n-1];.      iM
aa60: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
aa70: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d    }else if( res=
aa80: 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29  =0 && n<nField )
aa90: 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
aaa0: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
aab0: 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20  anLt[n-1];.     
aac0: 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b   iMin = iTest+1;
aad0: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b  .      res = -1;
aae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aaf0: 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73    iSample = iTes
ab00: 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  t;.      iCol = 
ab10: 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  n-1;.    }.  }wh
ab20: 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e  ile( res && iMin
ab30: 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20  <iSample );.  i 
ab40: 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65  = iSample / nFie
ab50: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
ab60: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
ab70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
ab80: 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
ab90: 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
aba0: 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
abb0: 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
abc0: 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
abd0: 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
abe0: 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
abf0: 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
ac00: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
ac10: 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
ac20: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
ac30: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
ac40: 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
ac50: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72  {.      /* If (r
ac60: 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20  es==0) is true, 
ac70: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62  then pRec must b
ac80: 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  e equal to sampl
ac90: 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  e i. */.      as
aca0: 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
acb0: 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61  ample );.      a
acc0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
acd0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  eld-1 );.      p
ace0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
acf0: 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65  ield;.      asse
ad00: 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64  rt( 0==sqlite3Vd
ad10: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
ad20: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
ad30: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
ad40: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
ad50: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
ad60: 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20  locFailed .     
ad70: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
ad80: 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69       /* Unless i
ad90: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
ada0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
adb0: 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72 20   pRec is larger 
adc0: 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c  than.      ** al
add0: 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  l samples in the
ade0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
adf0: 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73  , pRec must be s
ae00: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a  maller than the.
ae10: 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31        ** (iCol+1
ae20: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
ae30: 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a  f sample i.  */.
ae40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
ae50: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26  =pIdx->nSample &
ae60: 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  & i>=0 );.      
ae70: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  pRec->nField = i
ae80: 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  Col+1;.      ass
ae90: 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
aea0: 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
aeb0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
aec0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
aed0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
aee0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e  ple[i].p, pRec)>
aef0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
af00: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
af10: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
af20: 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e     /* if i==0 an
af30: 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  d iCol==0, then 
af40: 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 73  record pRec is s
af50: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20  maller than all 
af60: 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a  samples.      **
af70: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
af80: 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  ] array. Otherwi
af90: 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20  se, if (iCol>0) 
afa0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20  then pRec must. 
afb0: 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74       ** be great
afc0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
afd0: 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66   to the (iCol) f
afe0: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
aff0: 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a  ample i..      *
b000: 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e  * If (i>0), then
b010: 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20   pRec must also 
b020: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
b030: 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a  sample (i-1).  *
b040: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  /.      if( iCol
b050: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  >0 ){.        pR
b060: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f  ec->nField = iCo
b070: 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
b080: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  t( sqlite3VdbeRe
b090: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
b0a0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
b0b0: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30  e[i].p, pRec)<=0
b0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
b0d0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
b0e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
b0f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
b100: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  >0 ){.        pR
b110: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
b120: 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eld;.        ass
b130: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
b140: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
b150: 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
b160: 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
b170: 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20  ec)<0.          
b180: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
b190: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b1b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
b1c0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b1d0: 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d   */..  if( res==
b1e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f  0 ){.    /* Reco
b1f0: 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61 6c  rd pRec is equal
b200: 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a   to sample i */.
b210: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
b220: 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20  ==nField-1 );.  
b230: 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
b240: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
b250: 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
b260: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
b270: 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
b280: 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  e{.    /* At thi
b290: 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43  s point, the (iC
b2a0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
b2b0: 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d  ix of aSample[i]
b2c0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a 20   is the first . 
b2d0: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61     ** sample tha
b2e0: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
b2f0: 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69  n pRec. Or, if i
b300: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
b310: 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a  then pRec.    **
b320: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
b330: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74  all samples in t
b340: 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  he array. */.   
b350: 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c   tRowcnt iUpper,
b360: 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69   iGap;.    if( i
b370: 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
b380: 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  ){.      iUpper 
b390: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
b3a0: 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77  oInt(pIdx->aiRow
b3b0: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
b3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
b3d0: 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  per = aSample[i]
b3e0: 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
b3f0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77   }..    if( iLow
b400: 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
b410: 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
b420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b430: 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
b440: 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
b450: 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
b460: 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
b470: 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
b480: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
b490: 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
b4a0: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
b4b0: 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20  ower + iGap;.   
b4c0: 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
b4d0: 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65 6c 64 2d  ->aAvgEq[nField-
b4e0: 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  1];.  }..  /* Re
b4f0: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
b500: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
b510: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
b520: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
b530: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
b540: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
b550: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
b560: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b570: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
b580: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
b590: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
b5a0: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
b5b0: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
b5c0: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
b5d0: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
b5e0: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
b5f0: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
b600: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
b610: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
b620: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
b630: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
b640: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
b650: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
b660: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
b670: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
b680: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
b690: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
b6a0: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
b6b0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
b6c0: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
b6d0: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
b6e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
b6f0: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
b700: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
b710: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
b720: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
b730: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
b740: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
b750: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
b760: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
b770: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
b780: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
b790: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
b7a0: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
b7b0: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
b7c0: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
b7d0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
b7e0: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
b7f0: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
b800: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
b810: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
b820: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
b830: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
b840: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
b850: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
b860: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
b870: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
b880: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
b890: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
b8a0: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
b8b0: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
b8c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
b8d0: 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  Ret;.}...#ifdef 
b8e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
b8f0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
b900: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
b910: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
b920: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
b930: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20   index..*/.char 
b940: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
b950: 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74  mnAffinity(sqlit
b960: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
b970: 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Idx, int iCol){.
b980: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
b990: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
b9a0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
b9b0: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
b9c0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
b9d0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
b9e0: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
b9f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ba00: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
ba10: 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f  return pIdx->zCo
ba20: 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65  lAff[iCol];.}.#e
ba30: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
ba40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ba50: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  3_OR_STAT4./* .*
ba60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ba70: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
ba80: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
ba90: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
baa0: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
bab0: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
bac0: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
bad0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
bae0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
baf0: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
bb00: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
bb10: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
bb20: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
bb30: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
bb40: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
bb50: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
bb60: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
bb70: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
bb80: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
bb90: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
bba0: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
bbb0: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
bbc0: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
bbd0: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
bbe0: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
bbf0: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
bc00: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
bc10: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
bc20: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
bc30: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
bc40: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
bc50: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
bc60: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
bc70: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
bc80: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
bc90: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
bca0: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
bcb0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
bcc0: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
bcd0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
bce0: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
bcf0: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
bd00: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
bd10: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
bd20: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
bd30: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
bd40: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
bd50: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
bd60: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
bd70: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
bd80: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
bd90: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
bda0: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
bdb0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bdc0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
bdd0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
bde0: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
bdf0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
be00: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
be10: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
be20: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
be30: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
be40: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
be50: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
be60: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
be70: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
be80: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
be90: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
bea0: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
beb0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
bec0: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
bed0: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
bee0: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
bef0: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
bf00: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
bf10: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
bf20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
bf30: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
bf40: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
bf50: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
bf60: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
bf70: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
bf80: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
bf90: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
bfa0: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
bfb0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
bfc0: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
bfd0: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
bfe0: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
bff0: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
c000: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
c010: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
c020: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c030: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
c040: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
c050: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
c060: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
c070: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
c080: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
c090: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
c0a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
c0b0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
c0c0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
c0d0: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
c0e0: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
c0f0: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
c100: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
c110: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
c120: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
c130: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
c140: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
c150: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
c160: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
c170: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
c180: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
c190: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
c1a0: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
c1b0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
c1c0: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
c1d0: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
c1e0: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
c1f0: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
c200: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
c210: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
c220: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
c230: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c240: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
c250: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
c260: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
c270: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
c280: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c290: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c  ;.  u8 aff = sql
c2a0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
c2b0: 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e  ffinity(db, p, n
c2c0: 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Eq);.  CollSeq *
c2d0: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
c2e0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
c2f0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
c300: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
c310: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
c320: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
c330: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
c340: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
c350: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
c360: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
c370: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
c380: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
c390: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
c3a0: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
c3b0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
c3c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
c3d0: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
c3e0: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
c3f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c400: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
c410: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
c420: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
c430: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
c440: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
c450: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
c460: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c470: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c480: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
c490: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
c4a0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
c4b0: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
c4c0: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
c4d0: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
c4e0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
c4f0: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
c500: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
c510: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
c520: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
c530: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
c540: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
c550: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
c560: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
c570: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
c580: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
c590: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
c5a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c5b0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
c5c0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
c5d0: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
c5e0: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
c5f0: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
c600: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
c610: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
c620: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
c630: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
c640: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
c650: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
c660: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
c670: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
c680: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
c690: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
c6a0: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
c6b0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
c6c0: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
c6d0: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
c6e0: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
c6f0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
c700: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
c710: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
c720: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
c730: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
c740: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
c750: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
c760: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
c770: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
c780: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
c790: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
c7a0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
c7b0: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
c7c0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
c7d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
c7e0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
c7f0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
c800: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
c810: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
c820: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
c830: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
c840: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
c850: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
c860: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
c870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c880: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
c890: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
c8a0: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
c8b0: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
c8c0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
c8d0: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
c8e0: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
c8f0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
c900: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
c910: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
c920: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
c930: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
c960: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
c970: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
c980: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
c990: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
c9a0: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
c9b0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
c9c0: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
c9d0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
c9e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
c9f0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
ca00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ca10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
ca20: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
ca30: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT4 */../*.** Th
ca40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
ca50: 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
ca60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
ca70: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
ca80: 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
ca90: 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
caa0: 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
cab0: 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
cac0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
cad0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
cae0: 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
caf0: 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
cb00: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
cb10: 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
cb20: 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
cb30: 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
cb40: 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
cb50: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
cb60: 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
cb70: 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
cb80: 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
cb90: 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
cba0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
cbb0: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
cbc0: 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
cbe0: 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
cbf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
cc00: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
cc10: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
cc20: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
cc30: 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
cc40: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
cc50: 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
cc60: 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
cc70: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
cc80: 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
cc90: 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
cca0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
ccb0: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
ccc0: 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69  e value in (pBui
ccd0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
cce0: 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20  ree.nEq) is the 
ccf0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
cd00: 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
cd10: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
cd20: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
cd30: 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
cd40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
cd50: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
cd60: 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
cd70: 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
cd80: 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
cd90: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
cda0: 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
cdb0: 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
cdc0: 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
cdd0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
cde0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
cdf0: 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
ce00: 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
ce10: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
ce20: 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
ce30: 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
ce40: 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
ce50: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
ce60: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
ce70: 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
ce80: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
ce90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
cea0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
ceb0: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
cec0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
ced0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
cee0: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
cef0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
cf00: 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
cf10: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
cf20: 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
cf30: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
cf40: 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
cf50: 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
cf60: 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
cf70: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
cf80: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
cf90: 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
cfa0: 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69  0, then *pnOut i
cfb0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
cfc0: 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
cfd0: 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
cfe0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
cff0: 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
d000: 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
d010: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
d020: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
d030: 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
d040: 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
d050: 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
d060: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
d070: 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
d080: 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
d090: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
d0a0: 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69  a single range i
d0b0: 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
d0c0: 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
d0d0: 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
d0e0: 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70  f 4. .** and a p
d0f0: 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
d100: 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
d110: 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
d120: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
d130: 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
d140: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36  by a factor of 6
d150: 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
d160: 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
d170: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
d180: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
d190: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
d1a0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
d1b0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
d1c0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
d1d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
d1e0: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
d1f0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
d200: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
d210: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d220: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
d230: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
d240: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
d250: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
d260: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
d270: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
d280: 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
d290: 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
d2a0: 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
d2b0: 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
d2c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d2d0: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
d2e0: 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
d2f0: 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
d300: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d310: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
d320: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
d330: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
d340: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
d350: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
d360: 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
d370: 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d  mple>0 && nEq<p-
d380: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26  >nSampleCol.   &
d390: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
d3a0: 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
d3b0: 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29  , SQLITE_Stat34)
d3c0: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  .  ){.    if( nE
d3d0: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
d3e0: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
d3f0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
d400: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
d410: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
d420: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
d430: 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f   int nBtm = pLoo
d440: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b  p->u.btree.nBtm;
d450: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 70 20  .      int nTop 
d460: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
d470: 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a  .nTop;..      /*
d480: 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
d490: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
d4a0: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d4b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d4c0: 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ws in .      ** 
d4d0: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
d4e0: 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
d4f0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
d500: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
d510: 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   The.      ** lo
d520: 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
d530: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
d540: 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
d550: 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
d560: 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65        ** key-pre
d570: 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
d580: 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
d590: 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
d5a0: 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
d5b0: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
d5c0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
d5d0: 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
d5e0: 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
d5f0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
d600: 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20  r, if pLower is 
d610: 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f  NULL or $L canno
d620: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
d630: 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20  rom it (because 
d640: 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  it.      ** is n
d650: 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
d660: 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
d670: 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
d680: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
d690: 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73       ** range is
d6a0: 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
d6b0: 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
d6c0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
d6d0: 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20  orks, even.     
d6e0: 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
d6f0: 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
d700: 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
d710: 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
d720: 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24  and .      ** ($
d730: 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
d740: 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
d750: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
d760: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
d770: 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c  *.      ** Simil
d780: 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20  arly, iUpper is 
d790: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
d7a0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
d7b0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
d7c0: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
d7d0: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
d7e0: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
d7f0: 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65  query. Where the
d800: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20   upper bound.   
d810: 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
d820: 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e  ($P) or ($P:$U).
d830: 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20   Again, even if 
d840: 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $U is available,
d850: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20   both values.   
d860: 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
d870: 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
d880: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
d890: 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
d8a0: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
d8b0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d        ** The num
d8c0: 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77  ber of rows betw
d8d0: 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e  een the two boun
d8e0: 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20  ds is then just 
d8f0: 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20  iUpper-iLower.. 
d900: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52       */.      tR
d910: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20  owcnt iLower;   
d920: 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74    /* Rows less t
d930: 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
d940: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f  und */.      tRo
d950: 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20  wcnt iUpper;    
d960: 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68   /* Rows less th
d970: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
d980: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
d990: 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20  iLwrIdx = -2;   
d9a0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
d9b0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
d9c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55   */.      int iU
d9d0: 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a  prIdx = -1;   /*
d9e0: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
d9f0: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
da00: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  /..      if( pRe
da10: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  c ){.        tes
da20: 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69  tcase( pRec->nFi
da30: 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e  eld!=pBuilder->n
da40: 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  RecValid );.    
da50: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
da60: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
da70: 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a  cValid;.      }.
da80: 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
da90: 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
daa0: 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
dab0: 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
dac0: 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
dad0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
dae0: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
daf0: 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
db00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
db10: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
db20: 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
db30: 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
db40: 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
db50: 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
db60: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
db70: 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
db80: 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
db90: 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
dba0: 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
dbb0: 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
dbc0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
dbd0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
dbe0: 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
dbf0: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
dc00: 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
dc10: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
dc20: 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
dc30: 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
dc40: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
dc50: 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
dc60: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
dc70: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
dc80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
dc90: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
dca0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dcb0: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
dcc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
dcd0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
dce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
dcf0: 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
dd00: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
dd10: 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
dd20: 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
dd30: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
dd40: 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
dd50: 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Upper);.        
dd60: 53 57 41 50 28 69 6e 74 2c 20 6e 42 74 6d 2c 20  SWAP(int, nBtm, 
dd70: 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  nTop);.      }..
dd80: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
dd90: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
dda0: 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69   the iLower esti
ddb0: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
ddc0: 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  L). */.      if(
ddd0: 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
dde0: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de00: 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  Values extracted
de10: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
de20: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
de30: 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
de40: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
de50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de60: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
de70: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
de80: 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 42 74 6d  Rec, pExpr, nBtm
de90: 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20  , nEq, &n);.    
dea0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
deb0: 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20  TE_OK && n ){.  
dec0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
ded0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
dee0: 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54  u16 mask = WO_GT
def0: 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  |WO_LE;.        
df00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
df10: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
df20: 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57  r)>n ) mask = (W
df30: 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20  O_LE|WO_LT);.   
df40: 20 20 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d         iLwrIdx =
df50: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
df60: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
df70: 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  0, a);.         
df80: 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
df90: 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
dfa0: 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31  or & mask) ? a[1
dfb0: 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
dfc0: 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
dfd0: 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
dfe0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
dff0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
e000: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
e010: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e020: 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
e030: 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
e040: 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
e050: 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
e060: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
e070: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
e080: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
e090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
e0a0: 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66  lues extracted f
e0b0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
e0c0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
e0d0: 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
e0e0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
e0f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
e100: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
e110: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
e120: 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f 70 2c 20  c, pExpr, nTop, 
e130: 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  nEq, &n);.      
e140: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e150: 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20  _OK && n ){.    
e160: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
e170: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31  ew;.          u1
e180: 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57  6 mask = WO_GT|W
e190: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20  O_LE;.          
e1a0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 56  if( sqlite3ExprV
e1b0: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
e1c0: 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f  >n ) mask = (WO_
e1d0: 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20  LE|WO_LT);.     
e1e0: 20 20 20 20 20 69 55 70 72 49 64 78 20 3d 20 77       iUprIdx = w
e1f0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e200: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c  rse, p, pRec, 1,
e210: 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
e220: 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
e230: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
e240: 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20   & mask) ? a[1] 
e250: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
e260: 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20  if( iNew<iUpper 
e270: 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b  ) iUpper = iNew;
e280: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
e290: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70  -;.          pUp
e2a0: 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  per = 0;.       
e2b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
e2c0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
e2d0: 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69   = pRec;.      i
e2e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e300: 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
e310: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
e320: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
e330: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
e340: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
e350: 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20  UNING:  If both 
e360: 69 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65  iUpper and iLowe
e370: 72 20 61 72 65 20 64 65 72 69 76 65 64 20 66 72  r are derived fr
e380: 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  om the same.    
e390: 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c        ** sample,
e3a0: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65   then assume the
e3b0: 79 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65  y are 4x more se
e3c0: 6c 65 63 74 69 76 65 2e 20 20 54 68 69 73 20 62  lective.  This b
e3d0: 72 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  rings.          
e3e0: 2a 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ** the estimated
e3f0: 20 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72   selectivity mor
e400: 65 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77  e in line with w
e410: 68 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  hat it would be.
e420: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
e430: 65 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75  estimated withou
e440: 74 20 74 68 65 20 75 73 65 20 6f 66 20 53 54 41  t the use of STA
e450: 54 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a  T3/4 tables. */.
e460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c            if( iL
e470: 77 72 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29  wrIdx==iUprIdx )
e480: 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73   nNew -= 20;  as
e490: 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65  sert( 20==sqlite
e4a0: 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20  3LogEst(4) );.  
e4b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4c0: 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30         nNew = 10
e4d0: 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
e4e0: 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
e4f0: 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20  st(2) );.       
e500: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
e510: 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20  New<nOut ){.    
e520: 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65        nOut = nNe
e530: 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
e540: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
e550: 30 78 31 30 2c 20 28 22 53 54 41 54 34 20 72 61  0x10, ("STAT4 ra
e560: 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75  nge scan: %u..%u
e570: 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20    est=%d\n",.   
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f          (u32)iLo
e5a0: 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72  wer, (u32)iUpper
e5b0: 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  , nOut));.      
e5c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e5d0: 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30     int bDone = 0
e5e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
e5f0: 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
e600: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  st(pParse, pLowe
e610: 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70  r, pUpper, pLoop
e620: 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , &bDone);.     
e630: 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74   if( bDone ) ret
e640: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
e650: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
e660: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
e670: 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
e680: 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
e690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  ;.  assert( pLow
e6a0: 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
e6b0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
e6c0: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
e6d0: 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Upper->wtFlags &
e6e0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
e6f0: 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
e700: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f  eRangeAdjust(pLo
e710: 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e  wer, nOut);.  nN
e720: 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
e730: 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e  djust(pUpper, nN
e740: 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e  ew);..  /* TUNIN
e750: 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  G: If there is b
e760: 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
e770: 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64   lower limit and
e780: 20 6e 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20   neither limit. 
e790: 20 2a 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69   ** has an appli
e7a0: 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c  cation-defined l
e7b0: 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73  ikelihood(), ass
e7c0: 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73  ume the range is
e7d0: 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79  .  ** reduced by
e7e0: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37   an additional 7
e7f0: 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  5%. This means t
e800: 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c  hat, by default,
e810: 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20   an open-ended. 
e820: 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20   ** range query 
e830: 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69  (e.g. col > ?) i
e840: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74  s assumed to mat
e850: 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f  ch 1/4 of the ro
e860: 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ws in the.  ** i
e870: 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c  ndex. While a cl
e880: 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e  osed range (e.g.
e890: 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41   col BETWEEN ? A
e8a0: 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74  ND ?) is estimat
e8b0: 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  ed to.  ** match
e8c0: 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64   1/64 of the ind
e8d0: 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c  ex. */ .  if( pL
e8e0: 6f 77 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e  ower && pLower->
e8f0: 74 72 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70  truthProb>0 && p
e900: 55 70 70 65 72 20 26 26 20 70 55 70 70 65 72 2d  Upper && pUpper-
e910: 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a  >truthProb>0 ){.
e920: 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a      nNew -= 20;.
e930: 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28    }..  nOut -= (
e940: 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55  pLower!=0) + (pU
e950: 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20  pper!=0);.  if( 
e960: 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d  nNew<10 ) nNew =
e970: 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c   10;.  if( nNew<
e980: 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e  nOut ) nOut = nN
e990: 65 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ew;.#if defined(
e9a0: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
e9b0: 45 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ED).  if( pLoop-
e9c0: 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20  >nOut>nOut ){.  
e9d0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
e9e0: 30 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c  0,("Range scan l
e9f0: 6f 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20  owers nOut from 
ea00: 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20  %d to %d\n",.   
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f   pLoop->nOut, nO
ea30: 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ut));.  }.#endif
ea40: 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  .  pLoop->nOut =
ea50: 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20   (LogEst)nOut;. 
ea60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
ea70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ea80: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
ea90: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
eaa0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
eab0: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
eac0: 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
ead0: 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69   on.** an equali
eae0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d  ty constraint x=
eaf0: 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20  VALUE and where 
eb00: 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72  that VALUE occur
eb10: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74  s in.** the hist
eb20: 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69  ogram data.  Thi
eb30: 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65  s only works whe
eb40: 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d  n x is the left-
eb50: 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  most.** column o
eb60: 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73  f an index and s
eb70: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
eb80: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
eb90: 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74  ailable.** for t
eba0: 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e  hat index.  When
ebb0: 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61   pExpr==NULL tha
ebc0: 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73  t means the cons
ebd0: 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20  traint is.** "x 
ebe0: 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64  IS NULL" instead
ebf0: 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a   of "x=VALUE"..*
ec00: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
ec10: 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
ec20: 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
ec30: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
ec40: 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
ec50: 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
ec60: 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
ec70: 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
ec80: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
ec90: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
eca0: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
ecb0: 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
ecc0: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
ecd0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
ece0: 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
ecf0: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
ed00: 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
ed10: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
ed20: 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
ed30: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
ed40: 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
ed50: 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
ed60: 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
ed70: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
ed80: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
ed90: 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  nt whereEqualSca
eda0: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
edb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
edc0: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
edd0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
ede0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
edf0: 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
ee00: 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r,.  Expr *pExpr
ee10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  ,         /* Exp
ee20: 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55  ression for VALU
ee30: 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45  E in the x=VALUE
ee40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
ee50: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
ee60: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
ee70: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
ee80: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
ee90: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
eea0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
eeb0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
eec0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69    int nEq = pBui
eed0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
eee0: 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63  ree.nEq;.  Unpac
eef0: 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
ef00: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
ef10: 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef30: 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
ef40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
ef50: 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
ef60: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
ef70: 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
ef80: 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
ef90: 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
efa0: 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75  t( nEq<=p->nColu
efb0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
efc0: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
efd0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
efe0: 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
eff0: 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
f000: 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a  RecValid<nEq );.
f010: 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20  .  /* If values 
f020: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
f030: 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73  e for all fields
f040: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
f050: 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
f060: 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65  f this one, no e
f070: 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d  stimate can be m
f080: 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ade. Return SQLI
f090: 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a  TE_NOTFOUND. */.
f0a0: 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
f0b0: 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31  nRecValid<(nEq-1
f0c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f0d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
f0e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
f0f0: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
f100: 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c  on only. The cal
f110: 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74  l to sqlite3Stat
f120: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29  4ProbeSetValue()
f130: 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c  .  ** below woul
f140: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  d return the sam
f150: 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  e value.  */.  i
f160: 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75  f( nEq>=p->nColu
f170: 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  mn ){.    *pnRow
f180: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
f190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f1a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
f1b0: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
f1c0: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
f1d0: 65 63 2c 20 70 45 78 70 72 2c 20 31 2c 20 6e 45  ec, pExpr, 1, nE
f1e0: 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42  q-1, &bOk);.  pB
f1f0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
f200: 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Rec;.  if( rc!=S
f210: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
f220: 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d  n rc;.  if( bOk=
f230: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
f240: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70  TE_NOTFOUND;.  p
f250: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
f260: 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65  id = nEq;..  whe
f270: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
f280: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
f290: 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
f2a0: 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20  0x10,("equality 
f2b0: 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25 73 28  scan regions %s(
f2c0: 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20  %d): %d\n",.    
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f2e0: 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c 20  ->zName, nEq-1, 
f2f0: 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
f300: 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
f310: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f330: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
f340: 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
f350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f360: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
f370: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
f380: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
f390: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
f3a0: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
f3b0: 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
f3c0: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
f3d0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
f3e0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
f3f0: 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
f400: 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
f410: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
f420: 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
f430: 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
f440: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
f450: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
f460: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
f470: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
f480: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
f490: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
f4a0: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
f4b0: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
f4c0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
f4d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f4e0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
f4f0: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
f500: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
f510: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
f520: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
f530: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
f540: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
f550: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
f560: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
f570: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
f580: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
f590: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
f5a0: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
f5b0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
f5c0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
f5d0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
f5e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f5f0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
f600: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
f610: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
f620: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
f630: 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
f640: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
f650: 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
f660: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
f670: 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
f680: 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
f690: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
f6a0: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
f6b0: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
f6c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
f6d0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
f6e0: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
f6f0: 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
f700: 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
f710: 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
f720: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
f730: 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
f740: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
f750: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
f760: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
f770: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
f780: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
f790: 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
f7a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f7b0: 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
f7c0: 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
f7d0: 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
f7e0: 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
f7f0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
f800: 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
f810: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f820: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f830: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
f840: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
f850: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
f860: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
f870: 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
f880: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
f890: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
f8a0: 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
f8b0: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
f8c0: 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
f8d0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
f8e0: 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
f8f0: 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
f900: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
f910: 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
f920: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
f930: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
f940: 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
f950: 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
f960: 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
f970: 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
f980: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
f990: 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
f9a0: 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
f9b0: 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
f9c0: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
f9d0: 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
f9e0: 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
f9f0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
fa00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
fa10: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
fa20: 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
fa30: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
fa40: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
fa50: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
fa60: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
fa70: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
fa80: 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
fa90: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
faa0: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
fab0: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
fac0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fad0: 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
fae0: 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
faf0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
fb00: 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68 61 72  ype[4];.    char
fb10: 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20 20 20   zLeft[50];.    
fb20: 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e  memcpy(zType, ".
fb30: 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ..", 4);.    if(
fb40: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
fb50: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
fb60: 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b   zType[0] = 'V';
fb70: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fb80: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
fb90: 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d  QUIV  ) zType[1]
fba0: 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20   = 'E';.    if( 
fbb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fbc0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
fbd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79  _FromJoin) ) zTy
fbe0: 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20  pe[2] = 'L';.   
fbf0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
fc00: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
fc10: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
fc20: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
fc30: 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c  of(zLeft),zLeft,
fc40: 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22 2c 0a  "left={%d:%d}",.
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65         pTerm->le
fc70: 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d  ftCursor, pTerm-
fc80: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29 3b 0a  >u.leftColumn);.
fc90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
fca0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fcb0: 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26 20 70  & WO_OR)!=0 && p
fcc0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 21  Term->u.pOrInfo!
fcd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
fce0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
fcf0: 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74  eof(zLeft),zLeft
fd00: 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78 25 6c  ,"indexable=0x%l
fd10: 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ld", .          
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
fd30: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
fd40: 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20 20 7d  ndexable);.    }
fd50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
fd60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
fd70: 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74  eof(zLeft),zLeft
fd80: 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54 65 72  ,"left=%d", pTer
fd90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
fda0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fdb0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
fdc0: 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20       "TERM-%-3d 
fdd0: 25 70 20 25 73 20 25 2d 31 32 73 20 70 72 6f 62  %p %s %-12s prob
fde0: 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78 20  =%-3d op=0x%03x 
fdf0: 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78 22 2c  wtFlags=0x%04x",
fe00: 0a 20 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70  .       iTerm, p
fe10: 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20 7a 4c 65  Term, zType, zLe
fe20: 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  ft, pTerm->truth
fe30: 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65  Prob,.       pTe
fe40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70  rm->eOperator, p
fe50: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a  Term->wtFlags);.
fe60: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
fe70: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 73  Field ){.      s
fe80: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fe90: 66 28 22 20 69 46 69 65 6c 64 3d 25 64 5c 6e 22  f(" iField=%d\n"
fea0: 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 29  , pTerm->iField)
feb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fec0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
fed0: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
fee0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72   }.    sqlite3Tr
fef0: 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70 54  eeViewExpr(0, pT
ff00: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a  erm->pExpr, 0);.
ff10: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
ff20: 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
ff30: 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 68  ENABLED./*.** Sh
ff40: 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ow the complete 
ff50: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
ff60: 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69 64  reClause.*/.void
ff70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
ff80: 75 73 65 50 72 69 6e 74 28 57 68 65 72 65 43 6c  usePrint(WhereCl
ff90: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
ffa0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
ffb0: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
ffc0: 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65 72  +){.    whereTer
ffd0: 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b 69  mPrint(&pWC->a[i
ffe0: 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ], i);.  }.}.#en
fff0: 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
10000 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
10010 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
10020 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
10030 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
10040 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
10050 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
10060 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
10070 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
10080 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
10090 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
100a0 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
100b0 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
100c0 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f 34  bList->nSrc+3)/4
100d0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
100e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
100f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
10100 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
10110 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
10120 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 42  pItem->pTab;.  B
10130 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28 28  itmask mAll = ((
10140 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 62  (Bitmask)1)<<(nb
10150 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c 69  *4)) - 1;.  sqli
10160 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10170 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
10180 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
101b0 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
101c0 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41 6c   p->prereq & mAl
101d0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  l);.  sqlite3Deb
101e0 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22  ugPrintf(" %12s"
101f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10200 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
10210 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
10220 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
10230 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
10240 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
10250 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
10260 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
10270 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  r *zName;.    if
10280 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ( p->u.btree.pIn
10290 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  dex && (zName = 
102a0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
102b0 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  x->zName)!=0 ){.
102c0 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
102d0 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
102e0 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37  _autoindex_", 17
102f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10300 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53  int i = sqlite3S
10310 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d  trlen30(zName) -
10320 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
10330 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  e( zName[i]!='_'
10340 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) i--;.        
10350 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20  zName += i;.    
10360 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10370 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25  3DebugPrintf(".%
10380 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65  -16s %2d", zName
10390 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  , p->u.btree.nEq
103a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
103b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
103c0 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22  Printf("%20s",""
103d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
103e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
103f0 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62     if( p->u.vtab
10400 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  .idxStr ){.     
10410 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
10420 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22  intf("(%d,\"%s\"
10430 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%x)",.         
10440 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62         p->u.vtab
10450 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
10460 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e  ab.idxStr, p->u.
10470 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
10480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10490 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
104a0 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20  intf("(%d,%x)", 
104b0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
104c0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
104d0 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
104e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
104f0 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29  ntf(" %-19s", z)
10500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10510 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ee(z);.  }.  if(
10520 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48   p->wsFlags & WH
10530 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a  ERE_SKIPSCAN ){.
10540 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
10550 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20  Printf(" f %05x 
10560 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61  %d-%d", p->wsFla
10570 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d  gs, p->nLTerm,p-
10580 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65  >nSkip);.  }else
10590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
105a0 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
105b0 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
105c0 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b  ags, p->nLTerm);
105d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
105e0 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74  bugPrintf(" cost
105f0 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d   %d,%d,%d\n", p-
10600 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e  >rSetup, p->rRun
10610 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66  , p->nOut);.  if
10620 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28  ( p->nLTerm && (
10630 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
10640 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b  e & 0x100)!=0 ){
10650 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10660 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c  for(i=0; i<p->nL
10670 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
10680 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
10690 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69  (p->aLTerm[i], i
106a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
106b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
106c0 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
106d0 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
106e0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
106f0 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
10700 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
10710 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
10720 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10730 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
10740 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
10750 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
10760 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
10770 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
10780 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
10790 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
107a0 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
107b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
107c0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
107d0 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
107e0 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
107f0 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
10800 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
10810 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
10820 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10830 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
10840 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
10850 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
10860 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
10870 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
10880 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
10890 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
108a0 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
108b0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
108c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
108d0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
108e0 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
108f0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
10900 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
10910 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
10920 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
10930 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
10940 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
10950 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
10960 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
10970 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
10980 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
10990 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
109a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
109b0 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
109c0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
109d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
109e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
109f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
10a00 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
10a10 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
10a20 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
10a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10a40 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
10a50 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
10a60 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
10a70 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
10a80 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
10a90 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
10aa0 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72  >aLTerm);.  wher
10ab0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
10ac0 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c  db, p);.  whereL
10ad0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f  oopInit(p);.}../
10ae0 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
10af0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
10b00 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61  ion for pLoop->a
10b10 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74  LTerm[] to be at
10b20 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61   least n..*/.sta
10b30 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
10b40 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20  pResize(sqlite3 
10b50 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
10b60 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65  p, int n){.  Whe
10b70 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a  reTerm **paNew;.
10b80 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e    if( p->nLSlot>
10b90 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =n ) return SQLI
10ba0 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b  TE_OK;.  n = (n+
10bb0 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d  7)&~7;.  paNew =
10bc0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10bd0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
10be0 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e  (p->aLTerm[0])*n
10bf0 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d  );.  if( paNew==
10c00 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
10c10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10c20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d  memcpy(paNew, p-
10c30 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28  >aLTerm, sizeof(
10c40 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d  p->aLTerm[0])*p-
10c50 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20  >nLSlot);.  if( 
10c60 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
10c70 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
10c80 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
10c90 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d  p->aLTerm);.  p-
10ca0 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b  >aLTerm = paNew;
10cb0 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e  .  p->nLSlot = n
10cc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10cd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
10ce0 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20  ransfer content 
10cf0 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
10d00 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66  pLoop into the f
10d10 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  irst..*/.static 
10d20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65  int whereLoopXfe
10d30 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
10d40 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57  hereLoop *pTo, W
10d50 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29  hereLoop *pFrom)
10d60 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
10d70 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29  arUnion(db, pTo)
10d80 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
10d90 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c  pResize(db, pTo,
10da0 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20   pFrom->nLTerm) 
10db0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  ){.    memset(&p
10dc0 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  To->u, 0, sizeof
10dd0 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72  (pTo->u));.    r
10de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10df0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  EM_BKPT;.  }.  m
10e00 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
10e10 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
10e20 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
10e30 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
10e40 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
10e50 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
10e60 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
10e70 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
10e80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
10e90 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
10ea0 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
10eb0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
10ec0 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
10ed0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10ee0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
10ef0 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
10f00 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
10f10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
10f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10f30 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
10f40 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
10f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10f60 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
10f70 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
10f80 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
10f90 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
10fa0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
10fb0 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  eNN(db, p);.}../
10fc0 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
10fd0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
10fe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10ff0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
11000 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
11010 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
11020 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
11030 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20   pWInfo!=0 );.  
11040 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66  for(i=0; i<pWInf
11050 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  o->nLevel; i++){
11060 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
11070 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
11080 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28  o->a[i];.    if(
11090 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
110a0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  && (pLevel->pWLo
110b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
110c0 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a  ERE_IN_ABLE) ){.
110d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
110e0 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
110f0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
11100 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11110 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65  e3WhereClauseCle
11120 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
11130 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66  ;.  while( pWInf
11140 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20  o->pLoops ){.   
11150 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20   WhereLoop *p = 
11160 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a  pWInfo->pLoops;.
11170 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
11180 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
11190 70 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  p;.    whereLoop
111a0 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
111b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
111c0 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e 66 6f 29  eeNN(db, pWInfo)
111d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
111e0 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66  n TRUE if all of
111f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
11200 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
11210 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20   (1)  X has the 
11220 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
11230 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28  st that Y.**   (
11240 32 29 20 20 58 20 75 73 65 73 20 66 65 77 65 72  2)  X uses fewer
11250 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
11260 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a 20 20 20  rms than Y.**   
11270 28 33 29 20 20 45 76 65 72 79 20 57 48 45 52 45  (3)  Every WHERE
11280 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
11290 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75  d by X is also u
112a0 73 65 64 20 62 79 20 59 0a 2a 2a 20 20 20 28 34  sed by Y.**   (4
112b0 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65  )  X skips at le
112c0 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75  ast as many colu
112d0 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20 20 28 35  mns as Y.**   (5
112e0 29 20 20 49 66 20 58 20 69 73 20 61 20 63 6f 76  )  If X is a cov
112f0 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 61  ering index, tha
11300 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a 0a 2a 2a  n Y is too.**.**
11310 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28 32 29 20   Conditions (2) 
11320 61 6e 64 20 28 33 29 20 6d 65 61 6e 20 74 68 61  and (3) mean tha
11330 74 20 58 20 69 73 20 61 20 22 70 72 6f 70 65 72  t X is a "proper
11340 20 73 75 62 73 65 74 22 20 6f 66 20 59 2e 0a 2a   subset" of Y..*
11350 2a 20 49 66 20 58 20 69 73 20 61 20 70 72 6f 70  * If X is a prop
11360 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 20 74  er subset of Y t
11370 68 65 6e 20 59 20 69 73 20 61 20 62 65 74 74 65  hen Y is a bette
11380 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67  r choice and oug
11390 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20  ht.** to have a 
113a0 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69  lower cost.  Thi
113b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
113c0 73 20 54 52 55 45 20 77 68 65 6e 20 74 68 61 74  s TRUE when that
113d0 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69   cost .** relati
113e0 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72 74  onship is invert
113f0 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  ed and needs to 
11400 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20 43 6f  be adjusted.  Co
11410 6e 73 74 72 61 69 6e 74 20 28 34 29 0a 2a 2a 20  nstraint (4).** 
11420 77 61 73 20 61 64 64 65 64 20 62 65 63 61 75 73  was added becaus
11430 65 20 69 66 20 58 20 75 73 65 73 20 73 6b 69 70  e if X uses skip
11440 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20  -scan less than 
11450 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74  Y it still might
11460 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f  .** deserve a lo
11470 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66  wer cost even if
11480 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72 20   it is a proper 
11490 73 75 62 73 65 74 20 6f 66 20 59 2e 20 20 43 6f  subset of Y.  Co
114a0 6e 73 74 72 61 69 6e 74 20 28 35 29 0a 2a 2a 20  nstraint (5).** 
114b0 77 61 73 20 61 64 64 65 64 20 62 65 63 61 75 73  was added becaus
114c0 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
114d0 65 78 20 70 72 6f 62 61 62 6c 79 20 64 65 73 65  ex probably dese
114e0 72 76 65 73 20 74 6f 20 68 61 76 65 20 61 20 6c  rves to have a l
114f0 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20 74 68 61  ower cost.** tha
11500 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  n a non-covering
11510 20 69 6e 64 65 78 20 65 76 65 6e 20 69 66 20 69   index even if i
11520 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  t is a proper su
11530 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bset..*/.static 
11540 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
11550 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11560 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
11570 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
11580 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
11590 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
115a0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
115b0 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
115c0 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
115d0 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
115e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
115f0 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
11600 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70  m-pX->nSkip >= p
11610 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53  Y->nLTerm-pY->nS
11620 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  kip ){.    retur
11630 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
11640 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
11650 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e  /.  }.  if( pY->
11660 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69  nSkip > pX->nSki
11670 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
11680 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20  if( pX->rRun >= 
11690 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20  pY->rRun ){.    
116a0 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70  if( pX->rRun > p
116b0 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e  Y->rRun ) return
116c0 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
116d0 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
116e0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75  .    if( pX->nOu
116f0 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72  t > pY->nOut ) r
11700 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
11710 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
11720 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28   Y */.  }.  for(
11730 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  i=pX->nLTerm-1; 
11740 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
11750 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  if( pX->aLTerm[i
11760 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
11770 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e  .    for(j=pY->n
11780 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
11790 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
117a0 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58  Y->aLTerm[j]==pX
117b0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72  ->aLTerm[i] ) br
117c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
117d0 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
117e0 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73  0;  /* X not a s
117f0 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65  ubset of Y since
11800 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75   term X[i] not u
11810 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a  sed by Y */.  }.
11820 20 20 69 66 28 20 28 70 58 2d 3e 77 73 46 6c 61    if( (pX->wsFla
11830 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  gs&WHERE_IDX_ONL
11840 59 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 59  Y)!=0 .   && (pY
11850 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
11860 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
11870 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
11880 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29  * Constraint (5)
11890 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
118a0 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64   1;  /* All cond
118b0 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d  itions meet */.}
118c0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61  ../*.** Try to a
118d0 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f  djust the cost o
118e0 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d  f WhereLoop pTem
118f0 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72  plate upwards or
11900 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a   downwards so.**
11910 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   that:.**.**   (
11920 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  1) pTemplate cos
11930 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79  ts less than any
11940 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
11950 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f  s that are a pro
11960 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62  per.**       sub
11970 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65  set of pTemplate
11980 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65  .**.**   (2) pTe
11990 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72  mplate costs mor
119a0 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  e than any other
119b0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20   WhereLoops for 
119c0 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a  which pTemplate.
119d0 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72  **       is a pr
119e0 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a  oper subset..**.
119f0 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65  ** To say "Where
11a00 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70  Loop X is a prop
11a10 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20  er subset of Y" 
11a20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65  means that X use
11a30 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45  s fewer.** WHERE
11a40 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
11a50 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
11a60 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
11a70 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
11a80 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20  is.** also used 
11a90 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  by Y..*/.static 
11aa0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64  void whereLoopAd
11ab0 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57  justCost(const W
11ac0 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
11ad0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
11ae0 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70  e){.  if( (pTemp
11af0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
11b00 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
11b10 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
11b20 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  r(; p; p=p->pNex
11b30 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20  tLoop){.    if( 
11b40 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
11b50 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69  te->iTab ) conti
11b60 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d  nue;.    if( (p-
11b70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
11b80 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63  _INDEXED)==0 ) c
11b90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
11ba0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
11bb0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c  rProperSubset(p,
11bc0 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20   pTemplate) ){. 
11bd0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
11be0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f  Template cost do
11bf0 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  wnward so that i
11c00 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61  t is cheaper tha
11c10 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20  n its .      ** 
11c20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20  subset p. */.   
11c30 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
11c40 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
11c50 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
11c60 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11c90 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
11ca0 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
11cb0 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20   p->nOut-1));.  
11cc0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11cd0 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
11ce0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
11cf0 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d  nOut = p->nOut -
11d00 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
11d10 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
11d20 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
11d30 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a  Template, p) ){.
11d40 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
11d50 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75  pTemplate cost u
11d60 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  pward so that it
11d70 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61   is costlier tha
11d80 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20  n p since.      
11d90 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  ** pTemplate is 
11da0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
11db0 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57 48  of p */.      WH
11dc0 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22  ERETRACE(0x80,("
11dd0 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75  subset cost adju
11de0 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20  stment %d,%d to 
11df0 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d,%d\n",.      
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
11e20 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  , pTemplate->nOu
11e30 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  t, p->rRun, p->n
11e40 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 70  Out+1));.      p
11e50 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d  Template->rRun =
11e60 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20   p->rRun;.      
11e70 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
11e80 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20  = p->nOut + 1;. 
11e90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11ea0 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69 73  * Search the lis
11eb0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  t of WhereLoops 
11ec0 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69  in *ppPrev looki
11ed0 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20  ng for one that 
11ee0 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70 6c 61 63  can be.** replac
11ef0 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e  ed by pTemplate.
11f00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  .**.** Return NU
11f10 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  LL if pTemplate 
11f20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
11f30 6f 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  on the WhereLoop
11f40 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68   list..** In oth
11f50 65 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d  er words if pTem
11f60 70 6c 61 74 65 20 6f 75 67 68 74 20 74 6f 20 62  plate ought to b
11f70 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 66  e dropped from f
11f80 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61  urther considera
11f90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  tion..**.** If p
11fa0 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  X is a WhereLoop
11fb0 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20   that pTemplate 
11fc0 63 61 6e 20 72 65 70 6c 61 63 65 2c 20 74 68 65  can replace, the
11fd0 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  n return the.** 
11fe0 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73  link that points
11ff0 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66   to pX..**.** If
12000 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f   pTemplate canno
12010 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
12020 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  isting element o
12030 66 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e  f the list but n
12040 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64  eeds.** to be ad
12050 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
12060 61 73 20 61 20 6e 65 77 20 65 6e 74 72 79 2c 20  as a new entry, 
12070 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
12080 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
12090 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74  tail of the list
120a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
120b0 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f  eLoop **whereLoo
120c0 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57  pFindLesser(.  W
120d0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
120e0 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  v,.  const Where
120f0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a  Loop *pTemplate.
12100 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
12110 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50  p;.  for(p=(*ppP
12120 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d  rev); p; ppPrev=
12130 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
12140 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
12150 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
12160 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
12170 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
12180 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
12190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
121a0 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
121b0 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
121c0 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
121d0 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
121e0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
121f0 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
12200 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
12210 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
12220 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
12230 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
12240 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
12250 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
12260 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12270 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
12280 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
12290 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
122a0 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
122b0 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
122c0 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
122d0 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
122e0 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
122f0 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
12300 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
12310 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
12320 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
12330 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
12340 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
12350 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
12360 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
12370 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
12380 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
12390 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
123a0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
123b0 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
123c0 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
123d0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
123e0 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
123f0 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
12400 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
12410 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
12420 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
12430 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
12440 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
12450 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
12460 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
12470 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
12480 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
12490 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e  /* Any loop usin
124a0 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d  g an appliation-
124b0 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f  defined index (o
124c0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  r PRIMARY KEY or
124d0 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63  .    ** UNIQUE c
124e0 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68 20  onstraint) with 
124f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63  one or more == c
12500 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62 65  onstraints is be
12510 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
12520 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
12530 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  dex. Unless it i
12540 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a  s a skip-scan. *
12550 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  /.    if( (p->ws
12560 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
12570 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20  TO_INDEX)!=0.   
12580 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
12590 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20  >nSkip)==0.     
125a0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
125b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
125c0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
125d0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
125e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
125f0 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20  OLUMN_EQ)!=0.   
12600 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20    && (p->prereq 
12610 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
12620 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
12630 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20  >prereq.    ){. 
12640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12650 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69  }..    /* If exi
12660 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12670 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  p is better than
12680 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d   pTemplate, pTem
12690 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20  plate can be.   
126a0 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20   ** discarded.  
126b0 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
126c0 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a  etter if:.    **
126d0 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f     (1)  p has no
126e0 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69   more dependenci
126f0 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  es than pTemplat
12700 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
12710 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71  (2)  p has an eq
12720 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
12730 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  t than pTemplate
12740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12750 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
12760 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
12770 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a  =p->prereq    /*
12780 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
12790 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
127a0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20  plate->rSetup   
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
127c0 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
127d0 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
127e0 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20  /* (2b) */.     
12810 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
12820 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20   /* (2c) */.    
12850 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12860 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70  0;  /* Discard p
12870 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
12880 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65  }..    /* If pTe
12890 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73  mplate is always
128a0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20   better than p, 
128b0 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20  then cause p to 
128c0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
128d0 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70     ** with pTemp
128e0 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65  late.  pTemplate
128f0 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
12900 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  p if:.    **   (
12910 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  1)  pTemplate ha
12920 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
12930 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e  ences than p, an
12940 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
12950 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e  pTemplate has an
12960 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
12970 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20  cost than p..   
12980 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
12990 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
129a0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
129b0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20  mplate->prereq  
129c0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
129d0 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65   && p->rRun>=pTe
129e0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
12a10 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
12a20 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out>=pTemplate->
12a30 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
12a60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12a70 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
12a80 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
12a90 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
12aa0 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
12ab0 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43     break;   /* C
12ac0 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
12ad0 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d  rwritten by pTem
12ae0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  plate */.    }. 
12af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72   }.  return ppPr
12b00 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ev;.}../*.** Ins
12b10 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
12b20 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
12b30 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
12b40 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
12b50 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
12b60 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
12b70 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
12b80 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
12b90 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
12ba0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
12bb0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
12bc0 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
12bd0 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
12be0 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
12bf0 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
12c00 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
12c10 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
12c20 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
12c30 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
12c40 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
12c50 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
12c60 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
12c70 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
12c80 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
12c90 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
12ca0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
12cb0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63  t NULL then we c
12cc0 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
12cd0 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
12ce0 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
12cf0 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
12d00 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
12d10 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
12d20 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
12d30 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
12d40 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
12d50 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
12d60 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
12d70 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
12d80 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
12d90 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
12da0 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
12db0 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
12dc0 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
12dd0 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
12de0 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
12df0 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
12e00 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
12e10 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
12e20 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74   if the.** new t
12e30 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
12e40 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
12e50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
12e60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
12e70 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
12e80 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
12e90 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
12ea0 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
12eb0 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
12ec0 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
12ed0 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
12ee0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
12ef0 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
12f00 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
12f10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
12f20 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
12f30 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
12f40 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
12f50 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
12f60 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74  rrent loop.*/.st
12f70 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
12f80 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
12f90 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
12fa0 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
12fb0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
12fc0 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
12fd0 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66  , *p;.  WhereInf
12fe0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
12ff0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
13000 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
13010 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
13020 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
13030 2a 20 53 74 6f 70 20 74 68 65 20 73 65 61 72 63  * Stop the searc
13040 68 20 6f 6e 63 65 20 77 65 20 68 69 74 20 74 68  h once we hit th
13050 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13060 73 65 61 72 63 68 20 6c 69 6d 69 74 20 2a 2f 0a  search limit */.
13070 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
13080 69 50 6c 61 6e 4c 69 6d 69 74 3d 3d 30 20 29 7b  iPlanLimit==0 ){
13090 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
130a0 30 78 66 66 66 66 66 66 66 66 2c 28 22 3d 3d 3d  0xffffffff,("===
130b0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 73   query planner s
130c0 65 61 72 63 68 20 6c 69 6d 69 74 20 72 65 61 63  earch limit reac
130d0 68 65 64 20 3d 3d 3d 5c 6e 22 29 29 3b 0a 20 20  hed ===\n"));.  
130e0 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
130f0 70 4f 72 53 65 74 20 29 20 70 42 75 69 6c 64 65  pOrSet ) pBuilde
13100 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 20 3d 20 30  r->pOrSet->n = 0
13110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13120 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
13130 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c  pBuilder->iPlanL
13140 69 6d 69 74 2d 2d 3b 0a 0a 20 20 2f 2a 20 49 66  imit--;..  /* If
13150 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
13160 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
13170 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
13180 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
13190 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
131a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
131b0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
131c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
131d0 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b  plate->nLTerm ){
131e0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
131f0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31  ENABLED.      u1
13200 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
13210 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20  pOrSet->n;.     
13220 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
13230 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
13240 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f  ert(pBuilder->pO
13250 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rSet, pTemplate-
13260 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61  >prereq, pTempla
13270 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20  te->rRun,.      
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
132a0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a  emplate->nOut);.
132b0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
132c0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
132d0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
132e0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
132f0 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
13300 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
13310 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
13320 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
13330 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
13340 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
13350 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
13360 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
13370 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  dif.    }.    re
13380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13390 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
133a0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
133b0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
133c0 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
133d0 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
133e0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
133f0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
13400 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
13410 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
13420 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
13430 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
13440 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
13450 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
13460 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
13470 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
13480 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
13490 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
134a0 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
134b0 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
134c0 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
134d0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
134e0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
134f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13500 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
13510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13520 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
13530 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
13540 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
13550 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
13560 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
13570 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
13580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
13590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
135a0 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
135b0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
135c0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
135d0 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
135e0 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
135f0 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
13600 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
13610 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
13620 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
13630 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
13640 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
13650 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
13660 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
13670 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
13680 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
13690 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
136a0 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
136b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
136c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
136d0 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
136e0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
136f0 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
13700 57 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  WC);.      sqlit
13710 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
13720 20 20 77 69 74 68 3a 20 22 29 3b 0a 20 20 20 20    with: ");.    
13730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
13740 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
13750 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
13760 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f    }.    whereLoo
13770 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
13780 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
13790 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
137a0 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( p==0 ){.    /
137b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
137c0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64   WhereLoop to ad
137d0 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
137e0 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  the list */.    
137f0 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71  *ppPrev = p = sq
13800 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
13810 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  NN(db, sizeof(Wh
13820 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
13830 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
13840 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13850 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  PT;.    whereLoo
13860 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
13870 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
13880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
13890 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
138a0 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
138b0 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
138c0 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
138d0 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
138e0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
138f0 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
13900 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
13910 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
13920 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
13930 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
13940 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
13950 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
13960 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
13970 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
13980 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
13990 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
139a0 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
139b0 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
139c0 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
139d0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
139e0 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
139f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
13a00 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
13a10 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
13a20 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13a30 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
13a40 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
13a50 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
13a60 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
13a70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13a80 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
13a90 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
13aa0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
13ab0 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
13ac0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
13ad0 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
13ae0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
13af0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13b00 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
13b10 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
13b20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
13b30 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
13b40 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
13b50 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
13b60 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
13b70 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
13b80 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
13b90 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
13ba0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
13bb0 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
13bc0 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
13bd0 49 44 58 54 59 50 45 5f 49 50 4b 20 29 7b 0a 20  IDXTYPE_IPK ){. 
13be0 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
13bf0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
13c00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13c10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  c;.}../*.** Adju
13c20 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
13c30 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
13c40 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
13c50 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
13c60 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
13c70 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
13c80 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
13c90 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
13ca0 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
13cb0 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57  *.** For every W
13cc0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
13cd0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
13ce0 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
13cf0 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20  * and which has 
13d00 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
13d10 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20  ity assigned by 
13d20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c  one of the likel
13d30 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65  ihood(),.** like
13d40 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c  ly(), or unlikel
13d50 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  y() SQL function
13d60 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73  s, reduce the es
13d70 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a  timated number.*
13d80 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
13d90 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c   by the probabil
13da0 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ity specified..*
13db0 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f  *.** TUNING:  Fo
13dc0 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
13dd0 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
13de0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
13df0 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
13e00 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61  hich does not ha
13e10 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74  ve an assigned t
13e20 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
13e30 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20  , heuristics.** 
13e40 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20  described below 
13e50 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20  are used to try 
13e60 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
13e70 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
13e80 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50  y..** TODO --> P
13e90 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73  erhaps this is s
13ea0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f  omething that co
13eb0 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20  uld be improved 
13ec0 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62  by better.** tab
13ed0 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a  le statistics..*
13ee0 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31  *.** Heuristic 1
13ef0 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  :  Estimate the 
13f00 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
13f10 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68  y as 93.75%.  Th
13f20 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75  e 93.75%.** valu
13f30 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
13f40 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f   -1 in LogEst no
13f50 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20  tation, so this 
13f60 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a  means decrement.
13f70 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ** the WhereLoop
13f80 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20  .nOut field for 
13f90 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45  every such WHERE
13fa0 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
13fb0 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a  .** Heuristic 2:
13fc0 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74    If there exist
13fd0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  s one or more WH
13fe0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
13ff0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
14000 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58  "x==EXPR" and EX
14010 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  PR is not a cons
14020 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65  tant 0 or 1, the
14030 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a  n make sure the.
14040 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20  ** final output 
14050 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20  row estimate is 
14060 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  no greater than 
14070 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  1/4 of the total
14080 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
14090 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
140a0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
140b0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d  , assume that x=
140c0 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65  =EXPR will filte
140d0 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73  r.** out at leas
140e0 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77  t 3 out of 4 row
140f0 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d  s.  If EXPR is -
14100 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65  1 or 0 or 1, the
14110 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22  n maybe the.** "
14120 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f  x" column is boo
14130 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20  lean or else -1 
14140 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63  or 0 or 1 is a c
14150 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61  ommon default va
14160 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78  lue.** on the "x
14170 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20  " column and so 
14180 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  in that case onl
14190 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74  y cap the output
141a0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a   row estimate.**
141b0 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20   at 1/2 instead 
141c0 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69  of 1/4..*/.stati
141d0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
141e0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
141f0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
14200 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
14210 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
14220 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
14230 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
14240 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
14250 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
14260 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
14270 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
14280 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
14290 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
142a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
142b0 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
142c0 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
142d0 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
142e0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
142f0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
14300 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20   LogEst iReduce 
14310 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70  = 0;    /* pLoop
14320 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f  ->nOut should no
14330 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52  t exceed nRow-iR
14340 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65  educe */..  asse
14350 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
14360 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
14370 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
14380 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
14390 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
143a0 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
143b0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
143c0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
143d0 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
143e0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
143f0 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  AL)!=0 ) break;.
14400 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
14410 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
14420 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20  p->maskSelf)==0 
14430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14440 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
14450 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77  eqAll & notAllow
14460 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ed)!=0 ) continu
14470 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f  e;.    for(j=pLo
14480 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  op->nLTerm-1; j>
14490 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
144a0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
144b0 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
144c0 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75   pX==0 ) continu
144d0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  e;.      if( pX=
144e0 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
144f0 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50        if( pX->iP
14500 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57  arent>=0 && (&pW
14510 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74  C->a[pX->iParent
14520 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  ])==pTerm ) brea
14530 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14540 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66   j<0 ){.      if
14550 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
14560 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ob<=0 ){.       
14570 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20 70   /* If a truth p
14580 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73 70  robability is sp
14590 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74 68  ecified using th
145a0 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68  e likelihood() h
145b0 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ints,.        **
145c0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70 72   then use the pr
145d0 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64  obability provid
145e0 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  ed by the applic
145f0 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
14600 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d    pLoop->nOut +=
14610 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
14620 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  b;.      }else{.
14630 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
14640 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70  e absence of exp
14650 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f 62  licit truth prob
14660 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68  abilities, use h
14670 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20  euristics to.   
14680 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20       ** guess a 
14690 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68  reasonable truth
146a0 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f   probability. */
146b0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
146c0 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
146d0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
146e0 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
146f0 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  S) ){.          
14700 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
14710 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
14720 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  ght;.          t
14730 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
14740 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
14750 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
14760 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
14770 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26  nteger(pRight, &
14780 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26  k) && k>=(-1) &&
14790 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k<=1 ){.       
147a0 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20       k = 10;.   
147b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
147c0 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30            k = 20
147d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
147e0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64          if( iRed
147f0 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20  uce<k ) iReduce 
14800 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = k;.        }. 
14810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14820 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f  .  if( pLoop->nO
14830 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63  ut > nRow-iReduc
14840 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  e )  pLoop->nOut
14850 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63   = nRow - iReduc
14860 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72  e;.}../* .** Ter
14870 6d 20 70 54 65 72 6d 20 69 73 20 61 20 76 65 63  m pTerm is a vec
14880 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72  tor range compar
14890 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  ison operation. 
148a0 54 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72  The first compar
148b0 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76  ison.** in the v
148c0 65 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74  ector can be opt
148d0 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c  imized using col
148e0 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69  umn nEq of the i
148f0 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ndex. This.** fu
14900 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
14910 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
14920 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e  of vector elemen
14930 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ts that can be u
14940 73 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  sed.** as part o
14950 66 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70  f the range comp
14960 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  arison..**.** Fo
14970 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
14980 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
14990 2a 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20  *   WHERE a = ? 
149a0 41 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20  AND (b, c, d) > 
149b0 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20  (?, ?, ?).**.** 
149c0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a  and the index:.*
149d0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
149e0 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62  DEX ... ON (a, b
149f0 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a  , c, d, e).**.**
14a00 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
14a10 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76  ion would be inv
14a20 6f 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e  oked with nEq=1.
14a30 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
14a40 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63  ned in.** this c
14a50 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61  ase is 3..*/.sta
14a60 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
14a70 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50  geVectorLen(.  P
14a80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14a90 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14aa0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
14ab0 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
14ac0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
14ad0 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  on pIdx */.  Ind
14ae0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
14af0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
14b00 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  o be used for a 
14b10 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
14b20 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  raint */.  int n
14b30 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq,             
14b40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69  /* Number of pri
14b50 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  or equality cons
14b60 74 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20  traints on same 
14b70 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
14b80 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20  Term *pTerm     
14b90 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e  /* The vector in
14ba0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
14bb0 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  int */.){.  int 
14bc0 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78  nCmp = sqlite3Ex
14bd0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65  prVectorSize(pTe
14be0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
14bf0 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  );.  int i;..  n
14c00 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20  Cmp = MIN(nCmp, 
14c10 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d  (pIdx->nColumn -
14c20 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d   nEq));.  for(i=
14c30 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b  1; i<nCmp; i++){
14c40 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20  .    /* Test if 
14c50 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20  comparison i of 
14c60 70 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69  pTerm is compati
14c70 62 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  ble with column 
14c80 28 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20  (i+nEq) .    ** 
14c90 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66  of the index. If
14ca0 20 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c   not, exit the l
14cb0 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61  oop.  */.    cha
14cc0 72 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  r aff;          
14cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14ce0 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74  mparison affinit
14cf0 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64  y */.    char id
14d00 78 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  xaff = 0;       
14d10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65         /* Indexe
14d20 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  d columns affini
14d30 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ty */.    CollSe
14d40 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
14d50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
14d60 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20  rison collation 
14d70 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  sequence */.    
14d80 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65  Expr *pLhs = pTe
14d90 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
14da0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
14db0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
14dc0 2a 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pRhs = pTerm->p
14dd0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
14de0 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
14df0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
14e00 20 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d   ){.      pRhs =
14e10 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74   pRhs->x.pSelect
14e20 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
14e30 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
14e40 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52  .      pRhs = pR
14e50 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  hs->x.pList->a[i
14e60 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a  ].pExpr;.    }..
14e70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
14e80 74 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  t the LHS of the
14e90 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   comparison is a
14ea0 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
14eb0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
14ec0 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  right column of 
14ed0 74 68 65 20 72 69 67 68 74 20 73 6f 75 72 63 65  the right source
14ee0 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74   table. And that
14ef0 20 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a   the sort.    **
14f00 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e   order of the in
14f10 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  dex column is th
14f20 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f  e same as the so
14f30 72 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a  rt order of the.
14f40 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20      ** leftmost 
14f50 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a  index column.  *
14f60 2f 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e  /.    if( pLhs->
14f70 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
14f80 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61      || pLhs->iTa
14f90 62 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20  ble!=iCur .     
14fa0 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pLhs->iColumn
14fb0 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  !=pIdx->aiColumn
14fc0 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c  [i+nEq] .     ||
14fd0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
14fe0 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e  r[i+nEq]!=pIdx->
14ff0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a  aSortOrder[nEq].
15000 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
15010 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  ak;.    }..    t
15020 65 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69  estcase( pLhs->i
15030 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
15040 20 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   );.    aff = sq
15050 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
15060 6e 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74  nity(pRhs, sqlit
15070 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
15080 4c 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66  Lhs));.    idxaf
15090 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
150a0 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
150b0 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68  Idx->pTable, pLh
150c0 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  s->iColumn);.   
150d0 20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66 66   if( aff!=idxaff
150e0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70   ) break;..    p
150f0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
15100 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
15110 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
15120 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20   pRhs);.    if( 
15130 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pColl==0 ) break
15140 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15150 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
15160 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15170 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72  oll[i+nEq]) ) br
15180 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
15190 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n i;.}../*.** Ad
151a0 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20  just the cost C 
151b0 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20  by the costMult 
151c0 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20  facter T.  This 
151d0 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a  only occurs if.*
151e0 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  * compiled with 
151f0 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
15200 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64  COSTMULT.*/.#ifd
15210 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15220 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69  _COSTMULT.# defi
15230 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
15240 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b  iplier(C,T)  C +
15250 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  = T.#else.# defi
15260 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
15270 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64  iplier(C,T).#end
15280 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  if../*.** We hav
15290 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
152a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
152b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
152c0 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  ms of the .** in
152d0 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20  dex pIndex. Try 
152e0 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
152f0 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  e..**.** When th
15300 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15310 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d  alled, pBuilder-
15320 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74  >pNew->nOut cont
15330 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d  ains the .** num
15340 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
15350 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  cted to be visit
15360 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20  ed by filtering 
15370 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a  using the nEq .*
15380 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66  * terms only. If
15390 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c   it is modified,
153a0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72   this value is r
153b0 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74  estored before t
153c0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
153d0 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
153e0 49 66 20 70 50 72 6f 62 65 2d 3e 69 64 78 54 79  If pProbe->idxTy
153f0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
15400 50 45 5f 49 50 4b 2c 20 74 68 61 74 20 6d 65 61  PE_IPK, that mea
15410 6e 73 20 70 49 6e 64 65 78 20 69 73 20 0a 2a 2a  ns pIndex is .**
15420 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
15430 65 64 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  ed for the INTEG
15440 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
15450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
15460 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
15470 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
15480 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
15490 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
154a0 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
154b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
154c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
154d0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
154e0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
154f0 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
15500 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15520 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
15530 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49  c */.  LogEst nI
15540 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
15550 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
15560 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
15570 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
15580 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
15590 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
155a0 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
155b0 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
155c0 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
155d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
155e0 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
155f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15600 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
15610 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
15620 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
15630 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15640 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
15650 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
15660 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
15670 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
15680 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
15690 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
156a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
156b0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
156c0 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
156d0 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
156e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
156f0 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
15700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
15710 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
15720 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
15730 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
15740 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
15750 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
15760 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
15770 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
15780 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
15790 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
157a0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
157b0 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
157c0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
157d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
157e0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
157f0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
15800 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b    u16 saved_nEq;
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
15830 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
15840 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31  tree.nEq */.  u1
15850 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20  6 saved_nBtm;   
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15870 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15880 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
15890 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73  .nBtm */.  u16 s
158a0 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20  aved_nTop;      
158b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
158c0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
158d0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
158e0 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  op */.  u16 save
158f0 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
15900 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15910 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15920 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
15930 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15950 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15960 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
15970 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
15980 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
15990 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
159a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
159b0 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72  >nOut */.  int r
159c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
159d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
159e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
159f0 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
15a20 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
15a30 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
15a40 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
15a50 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
15a60 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
15a70 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
15a80 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
15a90 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
15aa0 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
15ab0 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
15ac0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
15ad0 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
15ae0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
15af0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15b00 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54 52  _BKPT;.  WHERETR
15b10 41 43 45 28 30 78 38 30 30 2c 20 28 22 42 45 47  ACE(0x800, ("BEG
15b20 49 4e 20 25 73 2e 61 64 64 42 74 72 65 65 49 64  IN %s.addBtreeId
15b30 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 5c 6e 22  x(%s), nEq=%d\n"
15b40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15b50 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e 70         pProbe->p
15b60 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 70 50 72  Table->zName,pPr
15b70 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  obe->zName, pNew
15b80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b  ->u.btree.nEq));
15b90 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
15ba0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15bb0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
15bc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15bd0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15be0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
15bf0 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
15c00 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
15c10 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
15c20 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
15c30 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
15c40 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
15c50 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15c60 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70  Btm==0 );.    op
15c70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
15c80 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
15c90 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53  O_LT|WO_LE|WO_IS
15ca0 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a  NULL|WO_IS;.  }.
15cb0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
15cc0 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
15cd0 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
15ce0 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
15cf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
15d00 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
15d10 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
15d20 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ..  saved_nEq = 
15d30 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15d40 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d 20  q;.  saved_nBtm 
15d50 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
15d60 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54  nBtm;.  saved_nT
15d70 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  op = pNew->u.btr
15d80 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64  ee.nTop;.  saved
15d90 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e  _nSkip = pNew->n
15da0 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  Skip;.  saved_nL
15db0 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
15dc0 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
15dd0 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
15de0 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
15df0 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
15e00 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
15e10 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
15e20 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
15e30 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
15e40 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
15e50 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61 76  rc->iCursor, sav
15e60 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20 20  ed_nEq,.        
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
15e90 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
15ea0 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70  = 0;.  rSize = p
15eb0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
15ec0 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a  st[0];.  rLogSiz
15ed0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
15ee0 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  );.  for(; rc==S
15ef0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
15f00 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68  m!=0; pTerm = wh
15f10 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
15f20 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70  n)){.    u16 eOp
15f30 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
15f40 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68  tor;   /* Shorth
15f50 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65  and for pTerm->e
15f60 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
15f70 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b  LogEst rCostIdx;
15f80 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  .    LogEst nOut
15f90 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20  Unadjusted;     
15fa0 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72     /* nOut befor
15fb0 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45  e IN() and WHERE
15fc0 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a   adjustments */.
15fd0 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b      int nIn = 0;
15fe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15ff0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
16000 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65  TAT4.    int nRe
16010 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
16020 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65  r->nRecValid;.#e
16030 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f  ndif.    if( (eO
16040 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p==WO_ISNULL || 
16050 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26  (pTerm->wtFlags&
16060 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a  TERM_VNULL)!=0).
16070 20 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f 6c       && indexCol
16080 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62  umnNotNull(pProb
16090 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20 20  e, saved_nEq).  
160a0 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
160b0 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
160c0 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
160d0 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
160e0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
160f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
16100 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
16110 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
16120 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
16130 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
16140 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  ow the upper bou
16150 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74  nd of a LIKE opt
16160 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20  imization range 
16170 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a  constraint.    *
16180 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20  * to mix with a 
16190 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e  lower range boun
161a0 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65  d from some othe
161b0 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20  r source */.    
161c0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
161d0 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
161e0 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  T && pTerm->eOpe
161f0 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63  rator==WO_LT ) c
16200 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
16210 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 63 6f   Do not allow co
16220 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20 74  nstraints from t
16230 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16240 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74 68  to be used by th
16250 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74 20 74  e.    ** right t
16260 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
16270 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73 74  OIN.  Only const
16280 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 4f 4e  raints in the ON
16290 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20 20 20   clause are.    
162a0 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ** allowed */.  
162b0 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e    if( (pSrc->fg.
162c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
162d0 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 21  FT)!=0.     && !
162e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
162f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
16300 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 29  _FromJoin).    )
16310 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
16320 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16330 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
16340 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64 5f  Probe) && saved_
16350 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
16360 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  yCol-1 ){.      
16370 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61  pBuilder->bldFla
16380 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44  gs |= SQLITE_BLD
16390 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  F_UNIQUE;.    }e
163a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69 6c  lse{.      pBuil
163b0 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d  der->bldFlags |=
163c0 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44   SQLITE_BLDF_IND
163d0 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  EXED;.    }.    
163e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
163f0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
16400 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16410 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
16420 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
16430 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64  ree.nBtm = saved
16440 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  _nBtm;.    pNew-
16450 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
16460 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20  saved_nTop;.    
16470 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
16480 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
16490 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
164a0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
164b0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
164c0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
164d0 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
164e0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
164f0 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
16500 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
16510 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
16520 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
16530 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
16540 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72  Self;..    asser
16550 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  t( nInMul==0.   
16560 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
16570 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
16580 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a  OLUMN_NULL)!=0 .
16590 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
165a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
165b0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20  E_COLUMN_IN)!=0 
165c0 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
165d0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
165e0 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
165f0 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
16600 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a   eOp & WO_IN ){.
16610 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
16620 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
16630 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
16640 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16650 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
16660 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
16670 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
16680 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
16690 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
166a0 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
166b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
166c0 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
166d0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
166e0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20  LogEst(25) );.. 
166f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
16700 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74  pression may act
16710 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20  ually be of the 
16720 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28  form (x, y) IN (
16730 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20  SELECT...)..    
16740 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
16750 61 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73  ase there is a s
16760 65 70 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72  eparate term for
16770 20 65 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64   each of (x) and
16780 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (y)..        **
16790 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49   However, the nI
167a0 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f  n multiplier sho
167b0 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c  uld only be appl
167c0 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e  ied once, not on
167d0 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  ce.        ** fo
167e0 72 20 65 61 63 68 20 73 75 63 68 20 74 65 72 6d  r each such term
167f0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
16800 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74  loop checks that
16810 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20   pTerm is the.  
16820 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73        ** first s
16830 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c  uch term in use,
16840 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61   and sets nIn ba
16850 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20 69 73  ck to 0 if it is
16860 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
16870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77   for(i=0; i<pNew
16880 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29  ->nLTerm-1; i++)
16890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
168a0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
168b0 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  && pNew->aLTerm[
168c0 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70 72  i]->pExpr==pExpr
168d0 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20   ) nIn = 0;.    
168e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
168f0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
16900 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
16910 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
16920 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
16930 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
16940 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
16950 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
16960 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
16970 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
16980 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  xpr);.        as
16990 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20  sert( nIn>0 );  
169a0 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61  /* RHS always ha
169b0 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  s 2 or more term
169c0 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72  s...  The parser
169d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
169e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
169f0 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
16a00 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
16a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16a20 28 20 70 50 72 6f 62 65 2d 3e 68 61 73 53 74 61  ( pProbe->hasSta
16a30 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f  t1 ){.        Lo
16a40 67 45 73 74 20 4d 2c 20 6c 6f 67 4b 2c 20 73 61  gEst M, logK, sa
16a50 66 65 74 79 4d 61 72 67 69 6e 3b 0a 20 20 20 20  fetyMargin;.    
16a60 20 20 20 20 2f 2a 20 4c 65 74 3a 0a 20 20 20 20      /* Let:.    
16a70 20 20 20 20 2a 2a 20 20 20 4e 20 3d 20 74 68 65      **   N = the
16a80 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
16a90 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
16aa0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
16ab0 4b 20 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  K = the number o
16ac0 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65  f entries on the
16ad0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
16ae0 70 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20  perator.        
16af0 2a 2a 20 20 20 4d 20 3d 20 74 68 65 20 6e 75 6d  **   M = the num
16b00 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
16b10 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
16b20 74 63 68 20 74 65 72 6d 73 20 74 6f 20 74 68 65  tch terms to the
16b30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
16b40 20 20 20 74 6f 20 74 68 65 20 6c 65 66 74 20 69     to the left i
16b50 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  n the same index
16b60 2e 20 20 49 66 20 74 68 65 20 49 4e 20 6f 70 65  .  If the IN ope
16b70 72 61 74 6f 72 20 69 73 20 6f 6e 0a 20 20 20 20  rator is on.    
16b80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65      **       the
16b90 20 6c 65 66 74 2d 6d 6f 73 74 20 69 6e 64 65 78   left-most index
16ba0 20 63 6f 6c 75 6d 6e 2c 20 4d 3d 3d 4e 2e 0a 20   column, M==N.. 
16bb0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
16bc0 20 20 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 64    ** Given the d
16bd0 65 66 69 6e 69 74 69 6f 6e 73 20 61 62 6f 76 65  efinitions above
16be0 2c 20 69 74 20 69 73 20 62 65 74 74 65 72 20 74  , it is better t
16bf0 6f 20 6f 6d 69 74 20 74 68 65 20 49 4e 20 6f 70  o omit the IN op
16c00 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  erator.        *
16c10 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
16c20 20 6c 6f 6f 6b 75 70 20 61 6e 64 20 69 6e 73 74   lookup and inst
16c30 65 61 64 20 64 6f 20 61 20 73 63 61 6e 20 6f 66  ead do a scan of
16c40 20 74 68 65 20 4d 20 65 6c 65 6d 65 6e 74 73 2c   the M elements,
16c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74  .        ** test
16c60 69 6e 67 20 65 61 63 68 20 73 63 61 6e 6e 65 64  ing each scanned
16c70 20 72 6f 77 20 61 67 61 69 6e 73 74 20 74 68 65   row against the
16c80 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 65 70   IN operator sep
16c90 61 72 61 74 65 6c 79 2c 20 69 66 3a 0a 20 20 20  arately, if:.   
16ca0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16cb0 2a 2a 20 20 20 20 20 20 20 20 4d 2a 6c 6f 67 28  **        M*log(
16cc0 4b 29 20 3c 20 4b 2a 6c 6f 67 28 4e 29 0a 20 20  K) < K*log(N).  
16cd0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
16ce0 20 2a 2a 20 4f 75 72 20 65 73 74 69 6d 61 74 65   ** Our estimate
16cf0 73 20 66 6f 72 20 4d 2c 20 4b 2c 20 61 6e 64 20  s for M, K, and 
16d00 4e 20 6d 69 67 68 74 20 62 65 20 69 6e 61 63 63  N might be inacc
16d10 75 72 61 74 65 2c 20 73 6f 20 77 65 20 62 75 69  urate, so we bui
16d20 6c 64 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ld in.        **
16d30 20 61 20 73 61 66 65 74 79 20 6d 61 72 67 69 6e   a safety margin
16d40 20 6f 66 20 32 20 28 4c 6f 67 45 73 74 3a 20 31   of 2 (LogEst: 1
16d50 30 29 20 74 68 61 74 20 66 61 76 6f 72 73 20 75  0) that favors u
16d60 73 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72  sing the IN oper
16d70 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ator.        ** 
16d80 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2c 20  with the index, 
16d90 61 73 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  as using an inde
16da0 78 20 68 61 73 20 62 65 74 74 65 72 20 77 6f 72  x has better wor
16db0 73 74 2d 63 61 73 65 20 62 65 68 61 76 69 6f 72  st-case behavior
16dc0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  ..        ** If 
16dd0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 72  we do not have r
16de0 65 61 6c 20 73 71 6c 69 74 65 5f 73 74 61 74 31  eal sqlite_stat1
16df0 20 64 61 74 61 2c 20 61 6c 77 61 79 73 20 70 72   data, always pr
16e00 65 66 65 72 20 74 6f 20 75 73 65 0a 20 20 20 20  efer to use.    
16e10 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
16e20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
16e30 20 20 20 20 20 4d 20 3d 20 70 50 72 6f 62 65 2d       M = pProbe-
16e40 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
16e50 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20  ed_nEq];.       
16e60 20 6c 6f 67 4b 20 3d 20 65 73 74 4c 6f 67 28 6e   logK = estLog(n
16e70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 61 66  In);.        saf
16e80 65 74 79 4d 61 72 67 69 6e 20 3d 20 31 30 3b 20  etyMargin = 10; 
16e90 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 65 78 74 72   /* TUNING: extr
16ea0 61 20 77 65 69 67 68 74 20 66 6f 72 20 69 6e 64  a weight for ind
16eb0 65 78 65 64 20 49 4e 20 2a 2f 0a 20 20 20 20 20  exed IN */.     
16ec0 20 20 20 69 66 28 20 4d 20 2b 20 6c 6f 67 4b 20     if( M + logK 
16ed0 2b 20 73 61 66 65 74 79 4d 61 72 67 69 6e 20 3c  + safetyMargin <
16ee0 20 6e 49 6e 20 2b 20 72 4c 6f 67 53 69 7a 65 20   nIn + rLogSize 
16ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ){.          WHE
16f00 52 45 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20  RETRACE(0x40,.  
16f10 20 20 20 20 20 20 20 20 20 20 28 22 53 63 61 6e            ("Scan
16f20 20 70 72 65 66 65 72 72 65 64 20 6f 76 65 72 20   preferred over 
16f30 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 6e 20 63  IN operator on c
16f40 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73  olumn %d of \"%s
16f50 5c 22 20 28 25 64 3c 25 64 29 5c 6e 22 2c 0a 20  \" (%d<%d)\n",. 
16f60 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
16f70 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a  d_nEq, pProbe->z
16f80 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c  Name, M+logK+10,
16f90 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b   nIn+rLogSize));
16fa0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
16fb0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nue;.        }el
16fc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48  se{.          WH
16fd0 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 0a 20  ERETRACE(0x40,. 
16fe0 20 20 20 20 20 20 20 20 20 20 20 28 22 49 4e 20             ("IN 
16ff0 6f 70 65 72 61 74 6f 72 20 70 72 65 66 65 72 72  operator preferr
17000 65 64 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20  ed on column %d 
17010 6f 66 20 5c 22 25 73 5c 22 20 28 25 64 3e 3d 25  of \"%s\" (%d>=%
17020 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
17030 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70      saved_nEq, p
17040 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b  Probe->zName, M+
17050 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f  logK+10, nIn+rLo
17060 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  gSize));.       
17070 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17080 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
17090 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
170a0 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  N;.    }else if(
170b0 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f   eOp & (WO_EQ|WO
170c0 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  _IS) ){.      in
170d0 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d  t iCol = pProbe-
170e0 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
170f0 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  nEq];.      pNew
17100 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
17110 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
17120 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65      assert( save
17130 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62  d_nEq==pNew->u.b
17140 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20  tree.nEq );.    
17150 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
17160 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  OWID .       || 
17170 28 69 43 6f 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d  (iCol>=0 && nInM
17180 75 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e  ul==0 && saved_n
17190 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
171a0 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  Col-1).      ){.
171b0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
171c0 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
171d0 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  robe->uniqNotNul
171e0 6c 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  l .         || (
171f0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d  pProbe->nKeyCol=
17200 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =1 && pProbe->on
17210 45 72 72 6f 72 20 26 26 20 65 4f 70 3d 3d 57 4f  Error && eOp==WO
17220 5f 45 51 29 20 0a 20 20 20 20 20 20 20 20 29 7b  _EQ) .        ){
17230 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
17240 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
17250 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
17260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17270 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
17280 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41   |= WHERE_UNQ_WA
17290 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NTED;.        }.
172a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
172b0 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49  e if( eOp & WO_I
172c0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  SNULL ){.      p
172d0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
172e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
172f0 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
17300 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f   eOp & (WO_GT|WO
17310 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
17320 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17330 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
17340 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
17350 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
17360 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
17370 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
17380 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
17390 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
173a0 74 72 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72  tree.nBtm = wher
173b0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
173c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
173d0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
173e0 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
173f0 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
17400 20 29 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d   );.      pBtm =
17410 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
17420 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
17430 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
17440 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
17450 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61  ){.        /* Ra
17460 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74  nge contraints t
17470 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  hat come from th
17480 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
17490 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20  ion are.        
174a0 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69  ** always used i
174b0 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20  n pairs. */.    
174c0 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72      pTop = &pTer
174d0 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  m[1];.        as
174e0 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65  sert( (pTop-(pTe
174f0 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65  rm->pWC->a))<pTe
17500 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29  rm->pWC->nTerm )
17510 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17520 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20  ( pTop->wtFlags 
17530 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
17540 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17550 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f  ( pTop->eOperato
17560 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20  r==WO_LT );.    
17570 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
17580 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
17590 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
175a0 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
175b0 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  M */.        pNe
175c0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
175d0 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70  nLTerm++] = pTop
175e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
175f0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
17600 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
17610 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
17620 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20  e.nTop = 1;.    
17630 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
17640 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
17650 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
17660 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17670 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
17680 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17690 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
176a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
176b0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
176c0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
176d0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
176e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
176f0 2e 6e 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e  .nTop = whereRan
17700 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20  geVectorLen(.   
17710 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
17720 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  Src->iCursor, pP
17730 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c  robe, saved_nEq,
17740 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a   pTerm.      );.
17750 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
17760 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
17770 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
17780 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
17790 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
177b0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
177c0 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
177d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
177e0 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d  this point pNew-
177f0 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  >nOut is set to 
17800 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17810 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20  ws expected to. 
17820 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64     ** be visited
17830 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63   by the index sc
17840 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64  an before consid
17850 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d  ering term pTerm
17860 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
17870 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e  values of nIn an
17880 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68  d nInMul. In oth
17890 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69  er words, assumi
178a0 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20  ng that all .   
178b0 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20   ** "x IN(...)" 
178c0 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63  terms are replac
178d0 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e  ed with "x = ?".
178e0 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61   This block upda
178f0 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  tes.    ** the v
17900 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
17910 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ut to account fo
17920 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74  r pTerm (but not
17930 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a   nIn/nInMul).  *
17940 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
17950 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
17960 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20  nOut );.    if( 
17970 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
17980 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
17990 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  GE ){.      /* A
179a0 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67  djust nOut using
179b0 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74   stat3/stat4 dat
179c0 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  a. Or, if there 
179d0 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74  is no stat3/stat
179e0 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c  4.      ** data,
179f0 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65   using some othe
17a00 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a  r estimate.  */.
17a10 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
17a20 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
17a30 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20  pBuilder, pBtm, 
17a40 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  pTop, pNew);.   
17a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
17a60 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e  t nEq = ++pNew->
17a70 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20  u.btree.nEq;.   
17a80 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
17a90 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45   (WO_ISNULL|WO_E
17aa0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29  Q|WO_IN|WO_IS) )
17ab0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
17ac0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
17ad0 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20  ed_nOut );.     
17ae0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
17af0 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f  hProb<=0 && pPro
17b00 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76  be->aiColumn[sav
17b10 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20  ed_nEq]>=0 ){.  
17b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
17b30 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
17b40 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
17b50 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
17b60 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
17b70 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
17b80 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
17b90 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17ba0 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
17bb0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
17bc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17bd0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
17be0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
17bf0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
17c00 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
17c10 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
17c20 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
17c30 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
17c40 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
17c50 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
17c60 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
17c70 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
17c80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17c90 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
17ca0 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
17cb0 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
17cc0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
17cd0 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a   SQLITE_Stat34).
17ce0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17cf0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
17d00 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
17d10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
17d20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
17d30 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d  ISNULL|WO_IS))!=
17d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
17d50 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
17d60 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
17d70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17d80 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
17d90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17da0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
17db0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
17dc0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
17dd0 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
17de0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
17df0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
17e00 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
17e10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
17e20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
17e30 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
17e40 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
17e50 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
17e60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17e70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17e80 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
17e90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17ea0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
17eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
17ec0 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
17ed0 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
17ee0 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
17ef0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
17f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17f10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
17f20 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
17f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17f40 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
17f50 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
17f60 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
17f70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
17f80 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
17f90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17fb0 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
17fc0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
17fd0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17fe0 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
17ff0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
18000 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
18010 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
18020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
18030 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
18040 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
18050 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
18060 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
18070 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
18080 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
18090 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
180a0 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
180b0 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
180c0 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
180d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
180e0 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
180f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
18100 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
18110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18120 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
18130 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
18140 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
18150 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
18160 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
18170 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
18180 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
18190 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
181a0 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
181b0 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
181c0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
181d0 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
181e0 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
181f0 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
18200 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
18210 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
18220 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
18230 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
18240 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
18250 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
18260 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
18270 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
18280 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
18290 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
182a0 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
182b0 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
182c0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
182d0 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
182e0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
182f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
18300 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
18310 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
18320 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
18330 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20  t + 16);.    }. 
18340 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
18350 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
18360 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c  n, pProbe->pTabl
18370 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20  e->costMult);.. 
18380 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
18390 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
183a0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
183b0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
183c0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
183d0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
183e0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
183f0 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
18400 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72  er->pWC, pNew, r
18410 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
18420 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
18430 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
18440 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
18450 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18460 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
18470 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
18480 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
18490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
184a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75  pNew->nOut = nOu
184b0 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20  tUnadjusted;.   
184c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65   }..    if( (pNe
184d0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
184e0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
184f0 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
18500 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
18510 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
18520 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
18530 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
18540 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
18550 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
18560 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
18570 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
18580 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
18590 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
185a0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
185b0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
185c0 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
185d0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
185e0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
185f0 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
18600 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
18610 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
18620 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
18630 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20  = saved_nBtm;.  
18640 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
18650 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b  op = saved_nTop;
18660 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
18670 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
18680 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
18690 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
186a0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
186b0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
186c0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
186d0 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
186e0 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
186f0 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
18700 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
18710 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
18720 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
18730 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
18740 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
18750 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
18760 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
18770 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
18780 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
18790 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
187a0 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
187b0 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
187c0 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
187d0 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
187e0 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
187f0 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
18800 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
18810 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
18820 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
18830 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
18840 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
18850 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
18860 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
18870 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
18880 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
18890 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
188a0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
188b0 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
188c0 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
188d0 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
188e0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
188f0 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
18900 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
18910 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
18920 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
18930 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
18940 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
18950 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
18960 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
18970 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
18980 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
18990 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
189a0 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
189b0 61 6e 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  an==0.   && Opti
189c0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
189d0 64 62 2c 20 53 51 4c 49 54 45 5f 53 6b 69 70 53  db, SQLITE_SkipS
189e0 63 61 6e 29 0a 20 20 20 26 26 20 70 50 72 6f 62  can).   && pProb
189f0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
18a00 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20  aved_nEq+1]>=42 
18a10 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69   /* TUNING: Mini
18a20 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  mum for skip-sca
18a30 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e  n */.   && (pWIn
18a40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
18a50 20 28 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53   (WHERE_WANT_DIS
18a60 54 49 4e 43 54 7c 57 48 45 52 45 5f 44 49 53 54  TINCT|WHERE_DIST
18a70 49 4e 43 54 42 59 29 29 3d 3d 30 0a 20 20 20 26  INCTBY))==0.   &
18a80 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  & (rc = whereLoo
18a90 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
18aa0 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
18ab0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
18ac0 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49  ){.    LogEst nI
18ad0 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ter;.    pNew->u
18ae0 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
18af0 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b    pNew->nSkip++;
18b00 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
18b10 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
18b20 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
18b30 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
18b40 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20  E_SKIPSCAN;.    
18b50 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e  nIter = pProbe->
18b60 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
18b70 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  d_nEq] - pProbe-
18b80 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
18b90 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70  ed_nEq+1];.    p
18ba0 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74  New->nOut -= nIt
18bb0 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e  er;.    /* TUNIN
18bc0 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65  G:  Because unce
18bd0 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65  rtainties in the
18be0 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73   estimates for s
18bf0 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73  kip-scan queries
18c00 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31  ,.    ** add a 1
18c10 2e 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f  .375 fudge facto
18c20 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73  r to make skip-s
18c30 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73  can slightly les
18c40 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20  s likely. */.   
18c50 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20   nIter += 5;.   
18c60 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
18c70 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
18c80 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
18c90 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b  nIter + nInMul);
18ca0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
18cb0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
18cc0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
18cd0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
18ce0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
18cf0 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
18d00 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
18d10 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
18d20 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54  s;.  }..  WHERET
18d30 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e  RACE(0x800, ("EN
18d40 44 20 25 73 2e 61 64 64 42 74 72 65 65 49 64 78  D %s.addBtreeIdx
18d50 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63  (%s), nEq=%d, rc
18d60 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
18d80 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e  robe->pTable->zN
18d90 61 6d 65 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  ame, pProbe->zNa
18da0 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 72  me, saved_nEq, r
18db0 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  c));.  return rc
18dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18dd0 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
18de0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
18df0 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
18e00 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
18e10 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
18e20 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
18e30 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
18e40 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
18e50 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
18e60 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
18e70 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
18e80 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
18e90 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
18ea0 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
18eb0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
18ec0 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
18ed0 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
18ee0 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
18ef0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
18f00 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
18f10 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
18f20 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
18f30 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
18f40 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
18f50 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c    ExprList *aCol
18f60 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20  Expr;.  int ii, 
18f70 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  jj;..  if( pInde
18f80 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
18f90 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
18fa0 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d  (pOB = pBuilder-
18fb0 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  >pWInfo->pOrderB
18fc0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
18fd0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
18fe0 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
18ff0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19000 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
19010 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
19020 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
19030 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
19040 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
19050 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
19060 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
19070 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
19080 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
19090 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
190a0 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
190b0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
190c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
190d0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
190e0 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
190f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
19100 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
19110 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64 65  aColExpr = pInde
19120 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30 20  x->aColExpr)!=0 
19130 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  ){.      for(jj=
19140 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b  0; jj<pIndex->nK
19150 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  eyCol; jj++){.  
19160 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
19170 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d  ->aiColumn[jj]!=
19180 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e  XN_EXPR ) contin
19190 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
191a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
191b0 72 65 53 6b 69 70 28 70 45 78 70 72 2c 61 43 6f  reSkip(pExpr,aCo
191c0 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78  lExpr->a[jj].pEx
191d0 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20 29  pr,iCursor)==0 )
191e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
191f0 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
19200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19210 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19220 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
19230 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
19240 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
19250 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
19260 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
19270 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
19280 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
19290 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
192a0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
192b0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
192c0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
192d0 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
192e0 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
192f0 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
19300 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
19310 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72 73 65 20  *pTerm;.  Parse 
19320 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
19330 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
19340 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
19350 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
19360 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62    if( !whereUsab
19370 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
19380 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e  Tab,pWC,pWhere->
19390 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
193a0 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  0;.    pWhere = 
193b0 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a  pWhere->pRight;.
193c0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
193d0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
193e0 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20  LITE_EnableQPSG 
193f0 29 20 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20  ) pParse = 0;.  
19400 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
19410 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
19420 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
19430 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19440 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
19450 70 72 3b 0a 20 20 20 20 69 66 28 20 28 21 45 78  pr;.    if( (!Ex
19460 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19470 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
19480 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67  ) || pExpr->iRig
19490 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
194a0 62 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  b).     && sqlit
194b0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
194c0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
194d0 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a   pWhere, iTab) .
194e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
194f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
19500 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19510 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
19520 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
19530 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62  for a single tab
19540 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77  le of the join w
19550 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a  here the table.*
19560 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  * is identified 
19570 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
19580 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
19590 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
195a0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
195b0 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
195c0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
195d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
195e0 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
195f0 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
19600 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
19610 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
19620 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
19630 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
19640 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
19650 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
19660 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
19670 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
19680 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
19690 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
196c0 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
196d0 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
19700 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
19710 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
19720 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
19730 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
19740 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
19750 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
19760 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
19770 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
19780 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
19790 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
197a0 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
197b0 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
197c0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
197d0 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
197e0 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
197f0 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
19800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
19810 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
19820 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
19830 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
19840 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
19850 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
19860 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
19870 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
19880 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
19890 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
198a0 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
198b0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
198c0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
198d0 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
198e0 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
198f0 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
19900 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
19910 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
19920 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
19930 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
19940 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
19950 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
19960 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
19970 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
19980 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
19990 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
199a0 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
199b0 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
199c0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
199d0 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
199e0 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
199f0 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
19a00 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
19a10 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
19a20 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
19a30 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
19a40 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
19a50 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
19a60 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
19a70 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
19a80 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
19a90 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
19aa0 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
19ab0 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
19ac0 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
19ad0 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
19ae0 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
19af0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
19b00 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
19b10 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
19b20 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
19b30 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
19b40 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
19b50 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
19b60 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
19b70 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
19b80 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
19b90 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
19ba0 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
19bb0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
19bc0 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
19bd0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
19be0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
19bf0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
19c00 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
19c10 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
19c20 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
19c30 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
19c40 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  eq             /
19c50 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
19c60 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
19c70 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
19c80 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
19c90 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
19ca0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
19cb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
19cc0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
19cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
19ce0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
19cf0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
19d00 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
19d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
19d20 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
19d30 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
19d40 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
19d50 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
19d60 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
19d70 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
19d80 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
19d90 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
19da0 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
19db0 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
19dc0 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
19dd0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
19de0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
19df0 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
19e00 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
19e10 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
19e20 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
19e30 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
19e40 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
19e50 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
19e60 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
19e70 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
19e80 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
19e90 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
19ea0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
19eb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19ec0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
19ed0 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
19ee0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
19ef0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
19f20 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
19f30 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
19f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
19f50 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
19f60 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
19f70 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
19f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
19f90 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
19fa0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
19fb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
19fc0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19fe0 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
19ff0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
1a000 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
1a010 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1a020 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
1a030 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
1a040 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
1a050 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1a060 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
1a070 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
1a080 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
1a090 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
1a0a0 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
1a0b0 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
1a0c0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
1a0d0 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
1a0e0 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
1a0f0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
1a100 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
1a110 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
1a120 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1a130 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
1a140 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
1a150 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
1a160 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
1a170 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
1a180 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1a190 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
1a1a0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1a1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1a1c0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
1a1d0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
1a1e0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
1a1f0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
1a200 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
1a210 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
1a220 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
1a230 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
1a240 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
1a250 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
1a260 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
1a270 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
1a280 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
1a290 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
1a2a0 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
1a2b0 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
1a2c0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1a2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1a2e0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
1a2f0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
1a300 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
1a310 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
1a320 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
1a330 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
1a340 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
1a350 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
1a360 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
1a370 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
1a380 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1a390 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1a3a0 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1a3b0 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1a3c0 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
1a3d0 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
1a3e0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 73 50  szTabRow;.    sP
1a3f0 6b 2e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49  k.idxType = SQLI
1a400 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b 3b 0a  TE_IDXTYPE_IPK;.
1a410 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
1a420 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
1a430 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
1a440 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
1a450 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1a460 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1a470 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e    if( pSrc->fg.n
1a480 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
1a490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
1a4a0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
1a4b0 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
1a4c0 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
1a4d0 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
1a4e0 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
1a4f0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
1a500 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a510 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
1a520 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
1a530 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
1a540 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
1a550 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
1a560 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
1a570 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
1a580 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1a590 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
1a5a0 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
1a5b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
1a5c0 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
1a5d0 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f  r->pOrSet      /
1a5e0 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  * Not part of an
1a5f0 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
1a600 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66   */.   && (pWInf
1a610 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1a620 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
1a630 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  SE)==0.   && (pW
1a640 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1a650 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1a660 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
1a670 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e    && pSrc->pIBIn
1a680 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48  dex==0      /* H
1a690 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
1a6a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
1a6b0 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e   !pSrc->fg.notIn
1a6c0 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e  dexed   /* Has n
1a6d0 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  o NOT INDEXED cl
1a6e0 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61  ause */.   && Ha
1a6f0 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20  sRowid(pTab)    
1a700 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48       /* Not WITH
1a710 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1a720 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74   (FIXME: Why not
1a730 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ?) */.   && !pSr
1a740 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  c->fg.isCorrelat
1a750 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ed /* Not a corr
1a760 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
1a770 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
1a780 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20  fg.isRecursive  
1a790 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69  /* Not a recursi
1a7a0 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20  ve common table 
1a7b0 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20  expression. */. 
1a7c0 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
1a7d0 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
1a7e0 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
1a7f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1a800 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
1a810 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
1a820 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1a830 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1a840 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
1a850 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
1a860 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
1a870 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1a880 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
1a890 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
1a8a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1a8b0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
1a8c0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
1a8d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1a8e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
1a8f0 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
1a900 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
1a910 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
1a920 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
1a930 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a940 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
1a950 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1a960 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
1a970 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1a980 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
1a990 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
1a9a0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1a9b0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73  is.        ** es
1a9c0 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a  timated to be X*
1a9d0 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
1a9e0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1a9f0 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
1aa00 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
1aa10 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e  being indexed an
1aa20 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28  d where X is 7 (
1aa30 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e  LogEst=28) for n
1aa40 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ormal.        **
1aa50 20 74 61 62 6c 65 73 20 6f 72 20 30 2e 35 20 28   tables or 0.5 (
1aa60 4c 6f 67 45 73 74 3d 2d 31 30 29 20 66 6f 72 20  LogEst=-10) for 
1aa70 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
1aa80 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  ries.  The value
1aa90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58  .        ** of X
1aaa0 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
1aab0 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
1aac0 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ries so that the
1aad0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20   query planner. 
1aae0 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
1aaf0 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76  e more aggressiv
1ab00 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69  e about generati
1ab10 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ng automatic ind
1ab20 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20  exes for.       
1ab30 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74   ** those object
1ab40 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  s, since there i
1ab50 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79  s no opportunity
1ab60 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20   to add schema. 
1ab70 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65         ** indexe
1ab80 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20  s on subqueries 
1ab90 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20  and views. */.  
1aba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1abb0 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
1abc0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1abd0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1abe0 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
1abf0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
1ac00 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
1ac10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
1ac20 74 75 70 20 2b 3d 20 32 38 3b 0a 20 20 20 20 20  tup += 28;.     
1ac30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac40 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1ac50 20 2d 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   -= 10;.        
1ac60 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
1ac70 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
1ac80 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62  ew->rSetup, pTab
1ac90 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1aca0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72       if( pNew->r
1acb0 53 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e  Setup<0 ) pNew->
1acc0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
1acd0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
1ace0 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  ach index lookup
1acf0 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20   yields 20 rows 
1ad00 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  in the table.  T
1ad10 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
1ad20 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  s more than the 
1ad30 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31  usual guess of 1
1ad40 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65  0 rows, since we
1ad50 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20   have no way.   
1ad60 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69       ** of knowi
1ad70 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65  ng how selective
1ad80 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
1ad90 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20  ultimately be.  
1ada0 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  It would.       
1adb0 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61   ** not be unrea
1adc0 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20  sonable to make 
1add0 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20  this value much 
1ade0 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
1adf0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1ae00 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d  43;  assert( 43=
1ae10 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
1ae20 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  0) );.        pN
1ae30 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
1ae40 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
1ae50 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
1ae60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1ae70 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1ae80 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
1ae90 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1aea0 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65   = mPrereq | pTe
1aeb0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
1aec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1aed0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1aee0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1aef0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1af00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1af10 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
1af20 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
1af30 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
1af40 64 69 63 65 73 2e 20 49 66 20 74 68 65 72 65 20  dices. If there 
1af50 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
1af60 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
1af70 6e 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  nly .  ** consid
1af80 65 72 20 69 6e 64 65 78 20 70 50 72 6f 62 65 2e  er index pProbe.
1af90 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
1afa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1afb0 72 6f 62 65 3b 20 0a 20 20 20 20 20 20 70 50 72  robe; .      pPr
1afc0 6f 62 65 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e  obe=(pSrc->pIBIn
1afd0 64 65 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65  dex ? 0 : pProbe
1afe0 2d 3e 70 4e 65 78 74 29 2c 20 69 53 6f 72 74 49  ->pNext), iSortI
1aff0 64 78 2b 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66  dx++.  ){.    if
1b000 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
1b010 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
1b020 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
1b030 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63  artialIndex(pSrc
1b040 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20  ->iCursor, pWC, 
1b050 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
1b060 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
1b070 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
1b080 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72  iTab!=pSrc->iCur
1b090 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74  sor );  /* See t
1b0a0 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66  icket [98d973b8f
1b0b0 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  5] */.      cont
1b0c0 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
1b0d0 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
1b0e0 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
1b0f0 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
1b100 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e    if( pProbe->bN
1b110 6f 51 75 65 72 79 20 29 20 63 6f 6e 74 69 6e 75  oQuery ) continu
1b120 65 3b 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70  e;.    rSize = p
1b130 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
1b140 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  st[0];.    pNew-
1b150 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
1b160 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
1b170 72 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20  ree.nBtm = 0;.  
1b180 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1b190 6e 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  nTop = 0;.    pN
1b1a0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
1b1b0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1b1c0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
1b1d0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
1b1e0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1b1f0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
1b200 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20  req = mPrereq;. 
1b210 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1b220 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
1b230 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
1b240 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
1b250 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
1b260 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
1b270 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
1b280 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
1b290 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
1b2a0 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
1b2b0 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
1b2c0 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
1b2d0 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
1b2e0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
1b2f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1b300 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
1b310 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
1b320 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 64 78   if( pProbe->idx
1b330 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
1b340 54 59 50 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  TYPE_IPK ){.    
1b350 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
1b360 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
1b370 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
1b380 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
1b390 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
1b3a0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
1b3b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1b3c0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
1b3d0 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
1b3e0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
1b3f0 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
1b400 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
1b410 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1b420 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
1b430 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
1b440 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
1b450 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
1b460 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
1b470 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
1b480 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
1b490 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
1b4a0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1b4b0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1b4c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
1b4d0 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1b4e0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1b4f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b500 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
1b510 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1b520 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
1b530 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1b540 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
1b550 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
1b560 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
1b570 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1b580 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
1b590 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 50  rc->colUsed & pP
1b5a0 72 6f 62 65 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  robe->colNotIdxe
1b5b0 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  d;.        pNew-
1b5c0 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
1b5d0 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
1b5e0 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
1b5f0 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
1b600 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
1b610 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
1b620 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
1b630 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
1b640 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
1b650 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72  b).       || pPr
1b660 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
1b670 72 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  re!=0.       || 
1b680 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
1b690 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
1b6a0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
1b6b0 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
1b6c0 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
1b6d0 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
1b6e0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1b6f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1b700 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
1b710 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
1b720 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b730 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
1b740 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
1b750 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
1b760 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
1b770 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
1b780 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
1b790 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1b7a0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1b7b0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
1b7c0 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
1b7d0 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  The cost of visi
1b7e0 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72  ting the index r
1b7f0 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72  ows is N*K, wher
1b800 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e K is.        *
1b810 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  * between 1.1 an
1b820 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67  d 3.0, depending
1b830 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
1b840 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20   sizes of the.  
1b850 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61        ** index a
1b860 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a  nd table rows. *
1b870 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1b880 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
1b890 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
1b8a0 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73  zIdxRow)/pTab->s
1b8b0 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20  zTabRow;.       
1b8c0 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
1b8d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1b8e0 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
1b8f0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20  ing index scan, 
1b900 61 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20  add in the cost 
1b910 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
1b920 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b  doing table look
1b930 75 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77  ups.  The cost w
1b940 69 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75  ill be 3x the nu
1b950 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
1b960 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54    ** lookups.  T
1b970 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ake into account
1b980 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1b990 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a  rms that can be.
1b9a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74            ** sat
1b9b0 69 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73  isfied using jus
1b9c0 74 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  t the index, and
1b9d0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
1b9e0 75 69 72 65 20 61 0a 20 20 20 20 20 20 20 20 20  uire a.         
1b9f0 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70   ** table lookup
1ba00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c  . */.          L
1ba10 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20  ogEst nLookup = 
1ba20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20  rSize + 16;  /* 
1ba30 42 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20  Base cost:  N*3 
1ba40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
1ba50 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69   ii;.          i
1ba60 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
1ba70 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
1ba80 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1ba90 70 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pWC2 = &pWInfo->
1baa0 73 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66  sWC;.          f
1bab0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32  or(ii=0; ii<pWC2
1bac0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
1bae0 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
1baf0 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  pWC2->a[ii];.   
1bb00 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1bb10 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
1bb20 42 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70  ByIndex(pTerm->p
1bb30 45 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f  Expr, iCur, pPro
1bb40 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
1bb50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bb60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bb70 20 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63        /* pTerm c
1bb80 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
1bb90 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
1bba0 6e 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65  ndex.  So reduce
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1bbc0 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
1bbd0 62 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f  ber of table loo
1bbe0 6b 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79  kups accordingly
1bbf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1bc00 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
1bc10 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
1bc20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70           nLookup
1bc30 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
1bc40 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Prob;.          
1bc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bc60 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d         nLookup--
1bc70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bc80 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1bc90 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
1bca0 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d  _IS) ) nLookup -
1bcb0 3d 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20  = 19;.          
1bcc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1bcd0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
1bce0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1bcf0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1bd00 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e  dd(pNew->rRun, n
1bd10 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20  Lookup);.       
1bd20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
1bd30 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
1bd40 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
1bd50 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
1bd60 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
1bd70 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
1bd80 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
1bd90 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bda0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1bdb0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1bdc0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1bdd0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1bde0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
1bdf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1be00 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46    pBuilder->bldF
1be10 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  lags = 0;.    rc
1be20 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1be30 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
1be40 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
1be50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42  , 0);.    if( pB
1be60 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73  uilder->bldFlags
1be70 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e  ==SQLITE_BLDF_IN
1be80 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  DEXED ){.      /
1be90 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71 75  * If a non-uniqu
1bea0 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 2c  e index is used,
1beb0 20 6f 72 20 69 66 20 61 20 70 72 65 66 69 78 20   or if a prefix 
1bec0 6f 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a 20  of the key for. 
1bed0 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20 69       ** unique i
1bee0 6e 64 65 78 20 69 73 20 75 73 65 64 20 28 6d 61  ndex is used (ma
1bef0 6b 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66  king the index f
1bf00 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d  unctionally non-
1bf10 75 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a 2a  unique).      **
1bf20 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
1bf30 5f 73 74 61 74 31 20 64 61 74 61 20 62 65 63 6f  _stat1 data beco
1bf40 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f  mes important fo
1bf50 72 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20 20  r scoring the.  
1bf60 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20      ** plan */. 
1bf70 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
1bf80 61 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73 55  ags |= TF_StatsU
1bf90 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  sed;.    }.#ifde
1bfa0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bfb0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
1bfc0 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
1bfd0 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
1bfe0 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
1bff0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
1c000 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
1c010 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
1c020 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
1c030 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1c040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1c050 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a  RTUALTABLE../*.*
1c060 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49  * Argument pIdxI
1c070 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70  nfo is already p
1c080 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c  opulated with al
1c090 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  l constraints th
1c0a0 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65  at may.** be use
1c0b0 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61 6c  d by the virtual
1c0c0 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
1c0d0 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
1c0e0 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a  New->iTab. This.
1c0f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b  ** function mark
1c100 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68  s a subset of th
1c110 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ose constraints 
1c120 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20  usable, invokes 
1c130 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  the.** xBestInde
1c140 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64  x method and add
1c150 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  s the returned p
1c160 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e  lan to pBuilder.
1c170 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61  .**.** A constra
1c180 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73  int is marked us
1c190 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  able if:.**.**  
1c1a0 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61   * Argument mUsa
1c1b0 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ble indicates th
1c1c0 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69 73  at its prerequis
1c1d0 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61 62  ites are availab
1c1e0 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  le, and.**.**   
1c1f0 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20  * It is not one 
1c200 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
1c210 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
1c220 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20  e mExclude mask 
1c230 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73  passed.**     as
1c240 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
1c250 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70  ment (which in p
1c260 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68 65  ractice is eithe
1c270 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a  r WO_IN or 0)..*
1c280 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50  *.** Argument mP
1c290 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1c2a0 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
1c2b0 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1c2c0 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72  efore the.** vir
1c2d0 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75  tual table in qu
1c2e0 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72  estion. These ar
1c2f0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
1c300 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69 74  lans prerequisit
1c310 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20  es.** before it 
1c320 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75 69  is added to pBui
1c330 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  lder..**.** Outp
1c340 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62  ut parameter *pb
1c350 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  In is set to tru
1c360 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64  e if the plan ad
1c370 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a  ded to pBuilder.
1c380 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ** uses one or m
1c390 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c  ore WO_IN terms,
1c3a0 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
1c3b0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1c3c0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1c3d0 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65  irtualOne(.  Whe
1c3e0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1c3f0 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61  Builder,.  Bitma
1c400 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20  sk mPrereq,     
1c410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c420 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
1c430 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20  t must be used. 
1c440 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73  */.  Bitmask mUs
1c450 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1c460 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c470 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f  usable tables */
1c480 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c  .  u16 mExclude,
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65     /* Exclude te
1c4b0 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65 20  rms using these 
1c4c0 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73  operators */.  s
1c4d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c4e0 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f  o *pIdxInfo,   /
1c4f0 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65  * Populated obje
1c500 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  ct for xBestInde
1c510 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  x */.  u16 mNoOm
1c520 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
1c530 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1c540 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73   omit these cons
1c550 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  traints */.  int
1c560 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20 20   *pbIn          
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c580 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61  OUT: True if pla
1c590 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e  n uses an IN(...
1c5a0 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  ) op */.){.  Whe
1c5b0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
1c5c0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1c5d0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
1c5e0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1c5f0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
1c600 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1c610 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
1c620 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49  age *pUsage = pI
1c630 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1c640 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20  intUsage;.  int 
1c650 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b  i;.  int mxTerm;
1c660 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c670 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f  TE_OK;.  WhereLo
1c680 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c  op *pNew = pBuil
1c690 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72  der->pNew;.  Par
1c6a0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75  se *pParse = pBu
1c6b0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
1c6c0 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20  Parse;.  struct 
1c6d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1c6e0 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e  rc = &pBuilder->
1c6f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1c700 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1c710 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
1c720 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt = pIdxInfo->n
1c730 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61  Constraint;..  a
1c740 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20  ssert( (mUsable 
1c750 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65  & mPrereq)==mPre
1c760 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d  req );.  *pbIn =
1c770 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72   0;.  pNew->prer
1c780 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20  eq = mPrereq;.. 
1c790 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61 62   /* Set the usab
1c7a0 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73  le flag on the s
1c7b0 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61  ubset of constra
1c7c0 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64 20  ints identified 
1c7d0 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e  by .  ** argumen
1c7e0 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d  ts mUsable and m
1c7f0 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49  Exclude. */.  pI
1c800 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
1c810 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1c820 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
1c830 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1c840 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
1c850 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1c860 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
1c870 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1c880 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
1c890 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
1c8a0 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78  ffset];.    pIdx
1c8b0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
1c8c0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1c8d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
1c8e0 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d  mUsable)==pTerm-
1c8f0 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20 20  >prereqRight .  
1c900 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f     && (pTerm->eO
1c910 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75  perator & mExclu
1c920 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  de)==0.    ){.  
1c930 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
1c940 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
1c950 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1c960 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
1c970 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71  fields of the sq
1c980 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1c990 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1c9a0 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
1c9b0 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
1c9c0 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29  0])*nConstraint)
1c9d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
1c9e0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1c9f0 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70  IdxStr==0 );.  p
1ca00 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
1ca10 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1ca20 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
1ca30 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1ca40 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
1ca50 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1ca60 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
1ca70 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
1ca80 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f  le)2;.  pIdxInfo
1ca90 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
1caa0 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f  = 25;.  pIdxInfo
1cab0 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a  ->idxFlags = 0;.
1cac0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55    pIdxInfo->colU
1cad0 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  sed = (sqlite3_i
1cae0 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73  nt64)pSrc->colUs
1caf0 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  ed;..  /* Invoke
1cb00 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1cb10 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  le xBestIndex() 
1cb20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d  method */.  rc =
1cb30 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
1cb40 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61  Parse, pSrc->pTa
1cb50 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
1cb60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
1cb70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ( rc==SQLITE_CON
1cb80 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
1cb90 20 2f 2a 20 49 66 20 74 68 65 20 78 42 65 73 74   /* If the xBest
1cba0 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 72 65 74  Index method ret
1cbb0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53  urns SQLITE_CONS
1cbc0 54 52 41 49 4e 54 2c 20 74 68 61 74 20 6d 65 61  TRAINT, that mea
1cbd0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ns.      ** that
1cbe0 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   the particular 
1cbf0 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 70  combination of p
1cc00 61 72 61 6d 65 74 65 72 73 20 70 72 6f 76 69 64  arameters provid
1cc10 65 64 20 69 73 20 75 6e 75 73 61 62 6c 65 2e 0a  ed is unusable..
1cc20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f        ** Make no
1cc30 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1cc40 6c 6f 6f 70 20 74 61 62 6c 65 2e 0a 20 20 20 20  loop table..    
1cc50 20 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45    */.      WHERE
1cc60 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
1cc70 20 20 5e 5e 5e 5e 2d 2d 2d 20 6e 6f 6e 2d 76 69    ^^^^--- non-vi
1cc80 61 62 6c 65 20 70 6c 61 6e 20 72 65 6a 65 63 74  able plan reject
1cc90 65 64 21 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ed!\n"));.      
1cca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ccb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1ccc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 6d 78  rn rc;.  }..  mx
1ccd0 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73  Term = -1;.  ass
1cce0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  ert( pNew->nLSlo
1ccf0 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  t>=nConstraint )
1cd00 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1cd10 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
1cd20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
1cd30 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1cd40 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20  vtab.omitMask = 
1cd50 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  0;.  pIdxCons = 
1cd60 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
1cd70 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1cd80 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
1cd90 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
1cda0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1cdb0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
1cdc0 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ons++){.    int 
1cdd0 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 28  iTerm;.    if( (
1cde0 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69  iTerm = pUsage[i
1cdf0 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29  ].argvIndex - 1)
1ce00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
1ce10 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
1ce20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49 64       int j = pId
1ce30 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
1ce40 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  et;.      if( iT
1ce50 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
1ce60 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20  .       || j<0. 
1ce70 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
1ce80 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c  >nTerm.       ||
1ce90 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
1cea0 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c  erm]!=0.       |
1ceb0 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62  | pIdxCons->usab
1cec0 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  le==0.      ){. 
1ced0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1cee0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
1cef0 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c  s.xBestIndex mal
1cf00 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
1cf10 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1cf20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cf30 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1cf40 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a 20 20  FreeIdxStr );.  
1cf50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cf60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1cf70 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
1cf80 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
1cf90 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
1cfa0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1cfb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1cfc0 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d  e( j==pWC->nTerm
1cfd0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72  -1 );.      pTer
1cfe0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
1cff0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1d000 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  eq |= pTerm->pre
1d010 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1d020 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
1d030 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1d040 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1d050 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
1d060 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d  .      if( iTerm
1d070 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
1d080 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
1d090 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
1d0a0 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73  =15 );.      tes
1d0b0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36  tcase( iTerm==16
1d0c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
1d0d0 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65  erm<16 && pUsage
1d0e0 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d  [i].omit ) pNew-
1d0f0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1d100 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20   |= 1<<iTerm;.  
1d110 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1d120 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1d130 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1d140 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
1d150 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
1d160 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
1d170 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
1d180 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
1d190 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
1d1a0 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
1d1b0 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
1d1c0 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
1d1d0 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
1d1e0 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
1d1f0 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
1d200 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
1d210 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
1d220 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
1d230 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
1d240 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
1d250 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  merge.        **
1d260 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20   together.  */. 
1d270 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1d280 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1d290 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49   = 0;.        pI
1d2a0 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1d2b0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45   &= ~SQLITE_INDE
1d2c0 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20  X_SCAN_UNIQUE;. 
1d2d0 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31         *pbIn = 1
1d2e0 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c  ; assert( (mExcl
1d2f0 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  ude & WO_IN)==0 
1d300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d310 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  .  }.  pNew->u.v
1d320 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d 20  tab.omitMask &= 
1d330 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65  ~mNoOmit;..  pNe
1d340 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
1d350 72 6d 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rm+1;.  for(i=0;
1d360 20 69 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b 2b 29   i<=mxTerm; i++)
1d370 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  {.    if( pNew->
1d380 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 7b 0a  aLTerm[i]==0 ){.
1d390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 6e        /* The non
1d3a0 2d 7a 65 72 6f 20 61 72 67 76 49 64 78 20 76 61  -zero argvIdx va
1d3b0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  lues must be con
1d3c0 74 69 67 75 6f 75 73 2e 20 20 52 61 69 73 65 20  tiguous.  Raise 
1d3d0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  an.      ** erro
1d3e0 72 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  r if they are no
1d3f0 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
1d400 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d410 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  e,"%s.xBestIndex
1d420 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53   malfunction",pS
1d430 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
1d440 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d450 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
1d460 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a  ToFreeIdxStr );.
1d470 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d480 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1d490 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d4a0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
1d4b0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 70  w->nLSlot );.  p
1d4c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
1d4d0 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
1d4e0 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75  dxNum;.  pNew->u
1d4f0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1d500 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1d510 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 70  oFreeIdxStr;.  p
1d520 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1d530 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
1d540 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1d550 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
1d560 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77 2d  >idxStr;.  pNew-
1d570 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
1d580 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66  d = (i8)(pIdxInf
1d590 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1d5a0 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78 49  ed ?.      pIdxI
1d5b0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20  nfo->nOrderBy : 
1d5c0 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  0);.  pNew->rSet
1d5d0 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
1d5e0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
1d5f0 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  gEstFromDouble(p
1d600 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1d610 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77 2d  edCost);.  pNew-
1d620 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
1d630 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e  ogEst(pIdxInfo->
1d640 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
1d650 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48  .  /* Set the WH
1d660 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20  ERE_ONEROW flag 
1d670 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  if the xBestInde
1d680 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63  x() method indic
1d690 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  ated.  ** that t
1d6a0 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
1d6b0 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72  it at most one r
1d6c0 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68  ow. Clear it oth
1d6d0 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66 28  erwise. */.  if(
1d6e0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1d6f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44  ags & SQLITE_IND
1d700 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29  EX_SCAN_UNIQUE )
1d710 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  {.    pNew->wsFl
1d720 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
1d730 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROW;.  }else{.  
1d740 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1d750 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57  &= ~WHERE_ONEROW
1d760 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65  ;.  }.  rc = whe
1d770 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1d780 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1d790 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1d7a0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1d7b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1d7c0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
1d7d0 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  r);.    pNew->u.
1d7e0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1d7f0 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52  0;.  }.  WHERETR
1d800 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 20 20  ACE(0xffff, ("  
1d810 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49 6e 3d  bIn=%d prereqIn=
1d820 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f 75 74  %04llx prereqOut
1d830 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20  =%04llx\n",.    
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74 65    *pbIn, (sqlite
1d860 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72 65 71  3_uint64)mPrereq
1d870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d880 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1d890 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e 70  _uint64)(pNew->p
1d8a0 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71  rereq & ~mPrereq
1d8b0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1d8c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
1d8d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d8e0 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 77 69 74  invoked from wit
1d8f0 68 69 6e 20 61 6e 20 78 42 65 73 74 49 6e 64 65  hin an xBestInde
1d900 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20 69 74  x() callback, it
1d910 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f  .** returns a po
1d920 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
1d930 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
1d940 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
1d950 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e  lation.** sequen
1d960 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ce associated wi
1d970 74 68 20 65 6c 65 6d 65 6e 74 20 69 43 6f 6e 73  th element iCons
1d980 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1d990 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f 6e 73  index_info.aCons
1d9a0 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72 61 79 2e  traint.** array.
1d9b0 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73 20 69 73   Or, if iCons is
1d9c0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72   out of range or
1d9d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63 74   there is no act
1d9e0 69 76 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a  ive xBestIndex.*
1d9f0 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72 6e 20 4e  * call, return N
1da00 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ULL..*/.const ch
1da10 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 74 61 62  ar *sqlite3_vtab
1da20 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c 69 74  _collation(sqlit
1da30 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1da40 49 64 78 49 6e 66 6f 2c 20 69 6e 74 20 69 43 6f  IdxInfo, int iCo
1da50 6e 73 29 7b 0a 20 20 48 69 64 64 65 6e 49 6e 64  ns){.  HiddenInd
1da60 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 20  exInfo *pHidden 
1da70 3d 20 28 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  = (HiddenIndexIn
1da80 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  fo*)&pIdxInfo[1]
1da90 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1daa0 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  zRet = 0;.  if( 
1dab0 69 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f 6e  iCons>=0 && iCon
1dac0 73 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  s<pIdxInfo->nCon
1dad0 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 43  straint ){.    C
1dae0 6f 6c 6c 53 65 71 20 2a 70 43 20 3d 20 30 3b 0a  ollSeq *pC = 0;.
1daf0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
1db00 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
1db10 72 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54 65  raint[iCons].iTe
1db20 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 45 78  rmOffset;.    Ex
1db30 70 72 20 2a 70 58 20 3d 20 70 48 69 64 64 65 6e  pr *pX = pHidden
1db40 2d 3e 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ->pWC->a[iTerm].
1db50 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
1db60 58 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  X->pLeft ){.    
1db70 20 20 70 43 20 3d 20 73 71 6c 69 74 65 33 42 69    pC = sqlite3Bi
1db80 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1db90 65 71 28 70 48 69 64 64 65 6e 2d 3e 70 50 61 72  eq(pHidden->pPar
1dba0 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
1dbb0 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
1dbc0 7d 0a 20 20 20 20 7a 52 65 74 20 3d 20 28 70 43  }.    zRet = (pC
1dbd0 20 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20 73   ? pC->zName : s
1dbe0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 29  qlite3StrBINARY)
1dbf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1dc00 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Ret;.}../*.** Ad
1dc10 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1dc20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
1dc30 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
1dc40 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
1dc50 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
1dc60 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
1dc70 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
1dc80 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
1dc90 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
1dca0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
1dcb0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1dcc0 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
1dcd0 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65  ery, both mPrere
1dce0 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62  q and.** mUnusab
1dcf0 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e  le are set to 0.
1dd00 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65   Otherwise, mPre
1dd10 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66  req is a mask of
1dd20 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
1dd30 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74  .** entries that
1dd40 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
1dd50 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1dd60 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1dd70 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65  se and are.** se
1dd80 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1dd90 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1dda0 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1ddb0 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74  IN. Similarly, t
1ddc0 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  he.** mUnusable 
1ddd0 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c  mask contains al
1dde0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  l FROM clause en
1ddf0 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1de00 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69   after the.** vi
1de10 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20  rtual table and 
1de20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72  are separated fr
1de30 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
1de40 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a  t one LEFT or .*
1de50 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a  * CROSS JOIN. .*
1de60 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1de70 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77  , if the query w
1de80 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  ere:.**.**   ...
1de90 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46   FROM t1, t2 LEF
1dea0 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76  T JOIN t3, t4, v
1deb0 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c  t CROSS JOIN t5,
1dec0 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   t6;.**.** then 
1ded0 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f  mPrereq correspo
1dee0 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20  nds to (t1, t2) 
1def0 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f  and mUnusable to
1df00 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a   (t5, t6)..**.**
1df10 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20   All the tables 
1df20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20  in mPrereq must 
1df30 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1df40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  e the current vi
1df50 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e  rtual .** table.
1df60 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   So any terms fo
1df70 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72  r which all prer
1df80 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61  equisites are sa
1df90 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d  tisfied by .** m
1dfa0 50 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70  Prereq may be sp
1dfb0 65 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62  ecified as "usab
1dfc0 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73  le" in all calls
1dfd0 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20   to xBestIndex. 
1dfe0 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20  .** Conversely, 
1dff0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55  all tables in mU
1e000 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20  nusable must be 
1e010 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68  scanned after th
1e020 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72  e current.** vir
1e030 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61  tual table, so a
1e040 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1e050 63 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73  ch the prerequis
1e060 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74  ites overlap wit
1e070 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73  h.** mUnusable s
1e080 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1e090 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e  configured as "n
1e0a0 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78  ot-usable" for x
1e0b0 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74  BestIndex..*/.st
1e0c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1e0d0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
1e0e0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1e0f0 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20   *pBuilder,  /* 
1e100 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
1e110 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
1e120 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20  tmask mPrereq,  
1e130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1e140 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1e150 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1e160 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42   this one */.  B
1e170 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1e180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e190 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1e1a0 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72  be scanned after
1e1b0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a   this one */.){.
1e1c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e1d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1e1e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e1f0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1e200 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
1e210 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
1e220 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
1e230 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
1e240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e250 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1e260 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
1e270 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
1e280 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1e290 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1e2a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e2b0 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
1e2c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1e2d0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
1e2e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1e2f0 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f  info *p;       /
1e300 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73  * Object to pass
1e310 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1e320 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74   */.  int nConst
1e330 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
1e340 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e350 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70  constraints in p
1e360 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20   */.  int bIn;  
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c     /* True if pl
1e390 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20  an uses IN(...) 
1e3a0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68  operator */.  Wh
1e3b0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1e3c0 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20   Bitmask mBest; 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e3e0 20 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20   Tables used by 
1e3f0 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c  best possible pl
1e400 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f  an */.  u16 mNoO
1e410 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  mit;..  assert( 
1e420 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73  (mPrereq & mUnus
1e430 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57  able)==0 );.  pW
1e440 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1e450 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
1e460 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1e470 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  se;.  pWC = pBui
1e480 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
1e490 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1e4a0 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
1e4b0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1e4c0 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
1e4d0 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
1e4e0 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1e4f0 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65  ;.  p = allocate
1e500 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
1e510 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65  , pWC, mUnusable
1e520 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72  , pSrc, pBuilder
1e530 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
1e540 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20     &mNoOmit);.  
1e550 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1e560 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1e570 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  KPT;.  pNew->rSe
1e580 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1e590 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1e5a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1e5b0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1e5c0 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
1e5d0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1e5e0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1e5f0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  p->nConstraint;.
1e600 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
1e610 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
1e620 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
1e630 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
1e640 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1e650 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65  ->db, p);.    re
1e660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e670 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
1e680 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65  * First call xBe
1e690 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61  stIndex() with a
1e6a0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75  ll constraints u
1e6b0 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52  sable. */.  WHER
1e6c0 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22  ETRACE(0x800, ("
1e6d0 42 45 47 49 4e 20 25 73 2e 61 64 64 56 69 72 74  BEGIN %s.addVirt
1e6e0 75 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63 2d 3e  ual()\n", pSrc->
1e6f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
1e700 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1e710 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1e720 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29  : all usable\n")
1e730 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c  );.  rc = whereL
1e740 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1e750 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1e760 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20  eq, ALLBITS, 0, 
1e770 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e  p, mNoOmit, &bIn
1e780 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1e790 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64  call to xBestInd
1e7a0 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65  ex() with all te
1e7b0 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64  rms enabled prod
1e7c0 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a  uced a plan.  **
1e7d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1e7e0 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63  equire any sourc
1e7f0 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61  e tables (IOW: a
1e800 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74   plan with mBest
1e810 3d 3d 30 29 0a 20 20 2a 2a 20 61 6e 64 20 64 6f  ==0).  ** and do
1e820 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e  es not use an IN
1e830 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2c 20  (...) operator, 
1e840 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
1e850 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67   point in making
1e860 20 0a 20 20 2a 2a 20 61 6e 79 20 66 75 72 74 68   .  ** any furth
1e870 65 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  er calls to xBes
1e880 74 49 6e 64 65 78 28 29 20 73 69 6e 63 65 20 74  tIndex() since t
1e890 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74  hey will all ret
1e8a0 75 72 6e 20 74 68 65 20 73 61 6d 65 0a 20 20 2a  urn the same.  *
1e8b0 2a 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65  * result (if the
1e8c0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 69 6d   xBestIndex() im
1e8d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
1e8e0 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20  sane). */.  if( 
1e8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e900 20 28 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77   ((mBest = (pNew
1e910 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1e920 72 65 71 29 29 21 3d 30 20 7c 7c 20 62 49 6e 29  req))!=0 || bIn)
1e930 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
1e940 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
1e950 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e960 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20   a plan with no 
1e970 70 72 65 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a  prereqs seen */.
1e980 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f      int seenZero
1e990 4e 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 20 20  NoIN = 0;       
1e9a0 20 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e    /* Plan with n
1e9b0 6f 20 70 72 65 72 65 71 73 20 61 6e 64 20 6e 6f  o prereqs and no
1e9c0 20 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f   IN(...) seen */
1e9d0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  .    Bitmask mPr
1e9e0 65 76 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d  ev = 0;.    Bitm
1e9f0 61 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20  ask mBestNoIn = 
1ea00 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
1ea10 65 20 70 6c 61 6e 20 70 72 6f 64 75 63 65 64 20  e plan produced 
1ea20 62 79 20 74 68 65 20 65 61 72 6c 69 65 72 20 63  by the earlier c
1ea30 61 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e 28 2e  all uses an IN(.
1ea40 2e 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20  ..) term, call. 
1ea50 20 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78     ** xBestIndex
1ea60 20 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69 6d   again, this tim
1ea70 65 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74  e with IN(...) t
1ea80 65 72 6d 73 20 64 69 73 61 62 6c 65 64 2e 20 2a  erms disabled. *
1ea90 2f 0a 20 20 20 20 69 66 28 20 62 49 6e 20 29 7b  /.    if( bIn ){
1eaa0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1eab0 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1eac0 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1ead0 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a  le w/o IN\n"));.
1eae0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1eaf0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1eb00 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1eb10 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1eb20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20  ALLBITS, WO_IN, 
1eb30 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e  p, mNoOmit, &bIn
1eb40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1eb50 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   bIn==0 );.     
1eb60 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65   mBestNoIn = pNe
1eb70 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72  w->prereq & ~mPr
1eb80 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28 20  ereq;.      if( 
1eb90 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a  mBestNoIn==0 ){.
1eba0 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f          seenZero
1ebb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65   = 1;.        se
1ebc0 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1ebd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ebe0 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74     /* Call xBest
1ebf0 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20 65  Index once for e
1ec00 61 63 68 20 64 69 73 74 69 6e 63 74 20 76 61 6c  ach distinct val
1ec10 75 65 20 6f 66 20 28 70 72 65 72 65 71 52 69 67  ue of (prereqRig
1ec20 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20 0a  ht & ~mPrereq) .
1ec30 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 65      ** in the se
1ec40 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74 20  t of terms that 
1ec50 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75 72  apply to the cur
1ec60 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61 62  rent virtual tab
1ec70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  le.  */.    whil
1ec80 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1ec90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1eca0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1ecb0 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a  Next = ALLBITS;.
1ecc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 4e        assert( mN
1ecd0 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 66  ext>0 );.      f
1ece0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
1ecf0 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
1ed00 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 68       Bitmask mTh
1ed10 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20  is = (.         
1ed20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f     pWC->a[p->aCo
1ed30 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
1ed40 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
1ed50 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 0a  ight & ~mPrereq.
1ed60 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1ed70 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50 72     if( mThis>mPr
1ed80 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78  ev && mThis<mNex
1ed90 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69  t ) mNext = mThi
1eda0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  s;.      }.     
1edb0 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a   mPrev = mNext;.
1edc0 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d        if( mNext=
1edd0 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61 6b  =ALLBITS ) break
1ede0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78  ;.      if( mNex
1edf0 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78  t==mBest || mNex
1ee00 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63  t==mBestNoIn ) c
1ee10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
1ee20 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1ee30 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1ee40 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65  mPrev=%04llx mNe
1ee50 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  xt=%04llx\n",.  
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69       (sqlite3_ui
1ee80 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71 6c  nt64)mPrev, (sql
1ee90 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78  ite3_uint64)mNex
1eea0 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
1eeb0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1eec0 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1eed0 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1eee0 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72  req, mNext|mPrer
1eef0 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  eq, 0, p, mNoOmi
1ef00 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1ef10 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  if( pNew->prereq
1ef20 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20 20 20  ==mPrereq ){.   
1ef30 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20       seenZero = 
1ef40 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  1;.        if( b
1ef50 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f  In==0 ) seenZero
1ef60 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  NoIN = 1;.      
1ef70 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ef80 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20  If the calls to 
1ef90 78 42 65 73 74 49 6e 64 65 78 28 29 20 69 6e 20  xBestIndex() in 
1efa0 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64  the above loop d
1efb0 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c  id not find a pl
1efc0 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  an.    ** that r
1efd0 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63  equires no sourc
1efe0 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20  e tables at all 
1eff0 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e  (i.e. one guaran
1f000 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a  teed to be.    *
1f010 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20  * usable), make 
1f020 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69 74 68  a call here with
1f030 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c   all source tabl
1f040 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  es disabled */. 
1f050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f060 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f  E_OK && seenZero
1f070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45  ==0 ){.      WHE
1f080 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1f090 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1f0a0 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b  l disabled\n"));
1f0b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1f0c0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1f0d0 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1f0e0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1f0f0 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20   mPrereq, 0, p, 
1f100 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1f110 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1f120 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1f130 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1f140 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20  /* If the calls 
1f150 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1f160 68 61 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c  have so far fail
1f170 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61  ed to find a pla
1f180 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  n.    ** that re
1f190 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65  quires no source
1f1a0 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61   tables at all a
1f1b0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  nd does not use 
1f1c0 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a  an IN(...).    *
1f1d0 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65  * operator, make
1f1e0 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f   a final call to
1f1f0 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65   obtain one here
1f200 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
1f210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1f220 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29  eenZeroNoIN==0 )
1f230 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1f240 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1f250 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1f260 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e  abled and w/o IN
1f270 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1f280 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1f290 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1f2a0 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1f2b0 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20  rereq, mPrereq, 
1f2c0 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  WO_IN, p, mNoOmi
1f2d0 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a  t, &bIn);.    }.
1f2e0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65    }..  if( p->ne
1f2f0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1f300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1f310 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1f320 74 65 33 44 62 46 72 65 65 4e 4e 28 70 50 61 72  te3DbFreeNN(pPar
1f330 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 57 48  se->db, p);.  WH
1f340 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
1f350 28 22 45 4e 44 20 25 73 2e 61 64 64 56 69 72 74  ("END %s.addVirt
1f360 75 61 6c 28 29 2c 20 72 63 3d 25 64 5c 6e 22 2c  ual(), rc=%d\n",
1f370 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
1f380 6d 65 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75  me, rc));.  retu
1f390 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1f3a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1f3b0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1f3c0 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
1f3d0 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
1f3e0 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
1f3f0 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
1f400 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
1f410 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
1f420 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1f430 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
1f440 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1f450 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
1f460 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1f470 65 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  eq, .  Bitmask m
1f480 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68  Unusable.){.  Wh
1f490 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1f4a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1f4b0 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  fo;.  WhereClaus
1f4c0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
1f4d0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
1f4e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
1f4f0 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
1f500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f510 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
1f520 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
1f530 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1f540 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
1f550 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c  WhereOrSet sSum,
1f560 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20   sCur;.  struct 
1f570 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f580 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20  tem;.  .  pWC = 
1f590 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1f5a0 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61   pWCEnd = pWC->a
1f5b0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
1f5c0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
1f5d0 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74  ->pNew;.  memset
1f5e0 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&sSum, 0, sizeo
1f5f0 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65  f(sSum));.  pIte
1f600 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
1f610 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
1f620 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70  iTab;.  iCur = p
1f630 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a  Item->iCursor;..
1f640 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1f650 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
1f660 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f670 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
1f680 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1f690 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
1f6a0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
1f6b0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
1f6c0 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
1f6d0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
1f6e0 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
1f6f0 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
1f700 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
1f710 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
1f720 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
1f730 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
1f740 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
1f750 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
1f760 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
1f770 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
1f780 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
1f790 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
1f7a0 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
1f7b0 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
1f7c0 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
1f7d0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
1f7e0 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
1f7f0 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57   &sCur;..      W
1f800 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
1f810 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73   ("Begin process
1f820 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1f830 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1f840 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
1f850 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
1f860 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
1f870 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1f880 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
1f890 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
1f8a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f8b0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
1f8c0 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
1f8d0 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
1f8e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
1f8f0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
1f900 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
1f910 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
1f920 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
1f930 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1f940 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
1f950 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1f960 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
1f970 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f980 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
1f990 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
1f9a0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
1f9b0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1f9c0 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
1f9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f9e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1f9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa00 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
1fa10 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
1fa20 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57  NABLED.        W
1fa30 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
1fa40 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66   ("OR-term %d of
1fa50 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65   %p has %d subte
1fa60 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20  rms:\n", .      
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
1fa80 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43  t)(pOrTerm-pOrWC
1fa90 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75  ->a), pTerm, sSu
1faa0 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
1fab0 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
1fac0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
1fad0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
1fae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1faf0 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28  hereClausePrint(
1fb00 73 53 75 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a  sSubBuild.pWC);.
1fb10 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
1fb20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fb30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1fb40 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
1fb50 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1fb60 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1fb70 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1fb80 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
1fb90 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1fba0 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1fbb0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1fbc0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1fbd0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1fbe0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
1fbf0 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 29  bBuild, mPrereq)
1fc00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fc10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fc20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fc30 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1fc40 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c  pAddOr(&sSubBuil
1fc50 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  d, mPrereq, mUnu
1fc60 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1fc70 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1fc80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fc90 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a  || sCur.n==0 );.
1fca0 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72          if( sCur
1fcb0 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
1fcc0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
1fcd0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1fce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1fcf0 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
1fd00 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1fd10 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20  &sSum, &sCur);. 
1fd20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
1fd30 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1fd40 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
1fd50 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20  eOrSet sPrev;.  
1fd60 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1fd70 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
1fd80 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
1fd90 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1fda0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1fdb0 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
1fdc0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1fdd0 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
1fde0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1fdf0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
1fe00 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
1fe10 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
1fe20 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [j].prereq,.    
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
1fe50 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
1fe60 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61  [i].rRun, sCur.a
1fe70 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20  [j].rRun),.     
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1fea0 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
1feb0 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b  i].nOut, sCur.a[
1fec0 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  j].nOut));.     
1fed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1fef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
1ff00 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
1ff10 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
1ff20 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
1ff30 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1ff40 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
1ff50 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  OR;.      pNew->
1ff60 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
1ff70 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
1ff80 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
1ff90 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
1ffa0 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
1ffb0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ffc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ffd0 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29  & i<sSum.n; i++)
1ffe0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  {.        /* TUN
1fff0 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73  ING: Currently s
20000 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73  Sum.a[i].rRun is
20010 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20   set to the sum 
20020 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20  of the costs.   
20030 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73       ** of all s
20040 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65  ub-scans require
20050 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e  d by the OR-scan
20060 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74  . However, due t
20070 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20  o rounding.     
20080 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74     ** errors, it
20090 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65   may be that the
200a0 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d   cost of the OR-
200b0 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f  scan is equal to
200c0 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
200d0 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73  most expensive s
200e0 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65  ub-scan. Add the
200f0 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62   smallest possib
20100 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20  le penalty .    
20110 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65      ** (equivale
20120 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e  nt to multiplyin
20130 67 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e  g the cost by 1.
20140 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68  07) to ensure th
20150 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  at .        ** t
20160 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  his does not hap
20170 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  pen. Otherwise, 
20180 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
20190 73 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20  s such as the.  
201a0 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
201b0 6e 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69  ng where there i
201c0 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79  s an index on "y
201d0 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ":.        **.  
201e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45        **     WHE
201f0 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d  RE likelihood(x=
20200 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a  ?, 0.99) OR y=?.
20210 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
20220 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65     ** the planne
20230 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22  r may elect to "
20240 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66  OR" together a f
20250 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61  ull-table scan a
20260 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  nd an.        **
20270 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41   index lookup. A
20280 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72  nd other similar
20290 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20  ly odd results. 
202a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
202b0 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
202c0 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20  i].rRun + 1;.   
202d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
202e0 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74  = sSum.a[i].nOut
202f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
20300 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b  prereq = sSum.a[
20310 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  i].prereq;.     
20320 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
20330 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
20340 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
20350 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
20360 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70  E(0x200, ("End p
20370 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
20380 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
20390 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
203a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
203b0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
203c0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
203d0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
203e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
203f0 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
20400 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
20410 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
20420 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
20430 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
20440 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
20450 65 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73  eq = 0;.  Bitmas
20460 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  k mPrior = 0;.  
20470 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c  int iTab;.  SrcL
20480 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
20490 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
204a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
204b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
204c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
204d0 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70  _item *pEnd = &p
204e0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66  TabList->a[pWInf
204f0 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71  o->nLevel];.  sq
20500 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
20510 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
20520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20530 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  E_OK;.  WhereLoo
20540 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72  p *pNew;.  u8 pr
20550 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  iorJointype = 0;
20560 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
20570 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
20580 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
20590 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
205a0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
205b0 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
205c0 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
205d0 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e   pBuilder->iPlan
205e0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 51  Limit = SQLITE_Q
205f0 55 45 52 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d  UERY_PLANNER_LIM
20600 49 54 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  IT;.  for(iTab=0
20610 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
20620 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b  ->a; pItem<pEnd;
20630 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
20640 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  ){.    Bitmask m
20650 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Unusable = 0;.  
20660 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
20670 54 61 62 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  Tab;.    pBuilde
20680 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 20 2b 3d  r->iPlanLimit +=
20690 20 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c   SQLITE_QUERY_PL
206a0 41 4e 4e 45 52 5f 4c 49 4d 49 54 5f 49 4e 43 52  ANNER_LIMIT_INCR
206b0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
206c0 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68  Self = sqlite3Wh
206d0 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
206e0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49  fo->sMaskSet, pI
206f0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
20700 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e     if( ((pItem->
20710 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  fg.jointype|prio
20720 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54  rJointype) & (JT
20730 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
20740 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
20750 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
20760 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65  s true when pIte
20770 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c  m is the FROM cl
20780 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65  ause term on the
20790 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d  .      ** right-
207a0 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c  hand-side of a L
207b0 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
207c0 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72  N.  */.      mPr
207d0 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  ereq = mPrior;. 
207e0 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
207f0 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  intype = pItem->
20800 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66  fg.jointype;.#if
20810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20820 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
20830 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
20840 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
20850 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
20860 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20  List_item *p;.  
20870 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d      for(p=&pItem
20880 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [1]; p<pEnd; p++
20890 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ){.        if( m
208a0 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e  Unusable || (p->
208b0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  fg.jointype & (J
208c0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
208d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
208e0 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69  Unusable |= sqli
208f0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
20900 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
20910 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  t, p->iCursor);.
20920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20930 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  }.      rc = whe
20940 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
20950 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
20960 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
20970 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
20980 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20990 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
209a0 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
209b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
209c0 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ee(pBuilder, mPr
209d0 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ereq);.    }.   
209e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
209f0 4f 4b 20 26 26 20 70 42 75 69 6c 64 65 72 2d 3e  OK && pBuilder->
20a00 70 57 43 2d 3e 68 61 73 4f 72 20 29 7b 0a 20 20  pWC->hasOr ){.  
20a10 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
20a20 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
20a30 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
20a40 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
20a50 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
20a60 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
20a70 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
20a80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
20a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20aa0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
20ab0 20 20 2f 2a 20 57 65 20 68 69 74 20 74 68 65 20    /* We hit the 
20ac0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 73 65  query planner se
20ad0 61 72 63 68 20 6c 69 6d 69 74 20 73 65 74 20 62  arch limit set b
20ae0 79 20 69 50 6c 61 6e 4c 69 6d 69 74 20 2a 2f 0a  y iPlanLimit */.
20af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20b00 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
20b10 4e 47 2c 20 22 61 62 62 72 65 76 69 61 74 65 64  NG, "abbreviated
20b20 20 71 75 65 72 79 20 61 6c 67 6f 72 69 74 68 6d   query algorithm
20b30 20 73 65 61 72 63 68 22 29 3b 0a 20 20 20 20 20   search");.     
20b40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20b50 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
20b60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20b80 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ..  whereLoopCle
20b90 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ar(db, pNew);.  
20ba0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20bb0 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68  .** Examine a Wh
20bc0 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68  erePath (with th
20bd0 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
20be0 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f  e extra WhereLoo
20bf0 70 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20  p of the 6th.** 
20c00 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73  parameters) to s
20c10 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73  ee if it outputs
20c20 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
20c30 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a  uested ORDER BY.
20c40 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  ** (or GROUP BY)
20c50 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69   without requiri
20c60 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f  ng a separate so
20c70 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52  rt operation.  R
20c80 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20  eturn N:.** .** 
20c90 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73    N>0:   N terms
20ca0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
20cb0 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
20cc0 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a  sfied.**   N==0:
20cd0 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68    No terms of th
20ce0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20cf0 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
20d00 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e  **   N<0:   Unkn
20d10 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79  own yet how many
20d20 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20   terms of ORDER 
20d30 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69  BY might be sati
20d40 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20  sfied.   .**.** 
20d50 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73  Note that proces
20d60 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47  sing for WHERE_G
20d70 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45  ROUPBY and WHERE
20d80 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e  _DISTINCTBY is n
20d90 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e  ot as.** strict.
20da0 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20    With GROUP BY 
20db0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65  and DISTINCT the
20dc0 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e   only requiremen
20dd0 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75  t is that.** equ
20de0 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70  ivalent rows app
20df0 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ear immediately 
20e00 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20  adjacent to one 
20e10 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20  another.  GROUP 
20e20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e  BY.** and DISTIN
20e30 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  CT do not requir
20e40 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72  e rows to appear
20e50 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c   in any particul
20e60 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67  ar order as long
20e70 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e  .** as equivalen
20e80 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70  t rows are group
20e90 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68  ed together.  Th
20ea0 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20  us for GROUP BY 
20eb0 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20  and DISTINCT.** 
20ec0 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72  the pOrderBy ter
20ed0 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  ms can be matche
20ee0 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20  d in any order. 
20ef0 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20   With ORDER BY, 
20f00 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79  the .** pOrderBy
20f10 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d   terms must be m
20f20 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74  atched in strict
20f30 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f   left-to-right o
20f40 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
20f50 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69  i8 wherePathSati
20f60 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20  sfiesOrderBy(.  
20f70 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
20f80 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  o,    /* The WHE
20f90 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
20fa0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
20fb0 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  y,   /* ORDER BY
20fc0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
20fd0 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
20fe0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68  to check */.  Wh
20ff0 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
21000 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
21010 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f  Path to check */
21020 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
21030 73 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  s,       /* WHER
21040 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49  E_GROUPBY or _DI
21050 53 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44  STINCTBY or _ORD
21060 45 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  ERBY_LIMIT */.  
21070 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
21080 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21090 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
210a0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
210b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
210c0 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
210d0 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
210e0 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
210f0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
21100 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
21110 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
21120 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
21130 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
21140 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
21150 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
21160 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21170 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
21180 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
21190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
211a0 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
211b0 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
211c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
211d0 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
211e0 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
211f0 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
21200 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
21210 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
21220 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
21230 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
21240 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21250 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
21260 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
21270 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
21280 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
21290 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
212a0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
212b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
212c0 0a 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b  .  u16 eqOpMask;
212d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
212e0 77 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  wed equality ope
212f0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20  rators */.  u16 
21300 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
21310 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
21320 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
21330 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
21340 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
21350 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
21360 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
21370 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
21380 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
21390 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
213a0 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
213b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
213c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
213d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
213e0 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
213f0 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
21400 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
21410 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
21420 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21430 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
21440 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
21450 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
21460 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
21470 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
21480 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
21490 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
214a0 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
214b0 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
214c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
214d0 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
214e0 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
214f0 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
21500 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
21510 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
21520 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
21530 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
21540 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
21550 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
21560 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
21570 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
21580 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
21590 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
215a0 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
215b0 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
215c0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
215d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
215e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
215f0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
21600 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
21610 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
21620 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
21630 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
21640 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
21650 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
21660 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
21670 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
21680 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
21690 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
216a0 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
216b0 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
216c0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
216d0 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
216e0 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
216f0 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
21700 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
21710 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
21720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21730 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
21740 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
21750 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
21760 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
21770 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
21780 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
21790 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
217a0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
217b0 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
217c0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
217d0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
217e0 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
217f0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
21800 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
21810 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
21820 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
21830 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
21840 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
21850 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
21860 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
21870 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
21880 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
21890 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
218a0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
218b0 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
218c0 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
218d0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
218e0 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
218f0 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
21900 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
21910 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
21920 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
21930 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
21940 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
21950 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
21960 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
21970 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
21980 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
21990 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
219a0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
219b0 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
219c0 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
219d0 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
219e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
219f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
21a00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
21a10 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
21a20 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
21a30 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
21a40 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
21a50 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
21a60 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
21a70 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
21a80 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
21a90 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
21aa0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
21ab0 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
21ac0 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
21ad0 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
21ae0 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
21af0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
21b00 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
21b10 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
21b20 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
21b30 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
21b40 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
21b50 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
21b60 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
21b70 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
21b80 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
21b90 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21ba0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
21bb0 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
21bc0 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
21bd0 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
21be0 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
21bf0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
21c00 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f  =0 );.  if( nLoo
21c10 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
21c20 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
21c30 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
21c40 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
21c50 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
21c60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
21c70 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
21c80 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
21c90 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
21ca0 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
21cb0 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
21cc0 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
21cd0 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
21ce0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
21cf0 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
21d00 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
21d10 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
21d20 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
21d30 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f  ready = 0;.  eqO
21d40 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20  pMask = WO_EQ | 
21d50 57 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c  WO_IS | WO_ISNUL
21d60 4c 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  L;.  if( wctrlFl
21d70 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
21d80 52 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70  RBY_LIMIT ) eqOp
21d90 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20  Mask |= WO_IN;. 
21da0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
21db0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
21dc0 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
21dd0 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
21de0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
21df0 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
21e00 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
21e10 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  elf;.    if( iLo
21e20 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20  op<nLoop ){.    
21e30 20 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d    pLoop = pPath-
21e40 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
21e50 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
21e60 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
21e70 52 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74  RBY_LIMIT ) cont
21e80 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
21e90 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
21ea0 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Last;.    }.    
21eb0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
21ec0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
21ed0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
21ee0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
21ef0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
21f00 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
21f10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21f20 7d 65 6c 73 65 20 69 66 28 20 77 63 74 72 6c 46  }else if( wctrlF
21f30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
21f40 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20  TINCTBY ){.     
21f50 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
21f60 6e 44 69 73 74 69 6e 63 74 43 6f 6c 20 3d 20 30  nDistinctCol = 0
21f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72  ;.    }.    iCur
21f80 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
21f90 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
21fa0 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
21fb0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
21fc0 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
21fd0 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
21fe0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
21ff0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
22000 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
22010 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
22020 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
22030 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
22040 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
22050 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
22060 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
22070 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
22080 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
22090 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
220a0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
220b0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
220c0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
220d0 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
220e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
220f0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
22100 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
22110 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
22120 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
22130 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22140 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
22150 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
22160 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
22170 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
22180 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49  ereFindTerm(&pWI
22190 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
221a0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
221b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
221c0 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
221d0 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20   eqOpMask, 0);. 
221e0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
221f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22200 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
22210 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
22220 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  ){.        /* IN
22230 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20   terms are only 
22240 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e  valid for sortin
22250 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  g in the ORDER B
22260 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20  Y LIMIT .       
22270 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
22280 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20  , and then only 
22290 69 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75  if they are actu
222a0 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20  ally used.      
222b0 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72    ** by the quer
222c0 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20  y plan */.      
222d0 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
222e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
222f0 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  ERBY_LIMIT );.  
22300 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
22310 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26  <pLoop->nLTerm &
22320 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e  & pTerm!=pLoop->
22330 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b  aLTerm[j]; j++){
22340 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
22350 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29  =pLoop->nLTerm )
22360 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22370 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
22380 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
22390 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
223a0 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
223b0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
223c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
223d0 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70  prCollSeqMatch(p
223e0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a  WInfo->pParse, .
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22400 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
22410 2e 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70  .pExpr, pTerm->p
22420 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Expr)==0 ){.    
22430 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22450 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
22460 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
22470 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _IS );.      }. 
22480 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
22490 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
224a0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
224b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
224c0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
224d0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
224e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
224f0 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
22500 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
22510 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
22520 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
22530 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
22540 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
22550 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
22560 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
22570 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
22580 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
22590 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
225a0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
225b0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
225c0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
225d0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
225e0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
225f0 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
22600 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
22610 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
22620 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
22630 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
22640 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
22650 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a  mn-1]==XN_ROWID.
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61            || !Ha
22680 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
22690 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
226a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
226b0 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78   = IsUniqueIndex
226c0 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
226d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
226e0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
226f0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
22700 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
22710 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
22720 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
22730 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
22740 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
22750 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
22760 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
22770 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
22780 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
22790 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  0; j<nColumn; j+
227a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
227b0 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75  Once = 1; /* Tru
227c0 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44  e to run the ORD
227d0 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f  ER BY search loo
227e0 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73  p */..        as
227f0 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e  sert( j>=pLoop->
22800 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20  u.btree.nEq .   
22810 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f           || (pLo
22820 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30  op->aLTerm[j]==0
22830 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b  )==(j<pLoop->nSk
22840 69 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ip).        );. 
22850 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
22860 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
22870 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b  && j>=pLoop->nSk
22880 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
22890 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d  u16 eOp = pLoop-
228a0 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65  >aLTerm[j]->eOpe
228b0 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20  rator;..        
228c0 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
228d0 3d 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e  = and IS and ISN
228e0 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73  ULL terms.  (Als
228f0 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20  o skip IN terms 
22900 77 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  when.          *
22910 2a 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52  * doing WHERE_OR
22920 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63  DERBY_LIMIT proc
22930 65 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20  essing). .      
22940 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
22950 20 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   ** If the curre
22960 6e 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c  nt term is a col
22970 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29  umn of an ((?,?)
22980 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29   IN (SELECT...))
22990 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65   .          ** e
229a0 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68  xpression for wh
229b0 69 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72  ich the SELECT r
229c0 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
229d0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20   one column,.   
229e0 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20         ** check 
229f0 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f  that it is the o
22a00 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20  nly column used 
22a10 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74  by this loop. Ot
22a20 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20  herwise,.       
22a30 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f     ** if it is o
22a40 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ne of two or mor
22a50 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63  e, none of the c
22a60 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20  olumns can be.  
22a70 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69          ** consi
22a80 64 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61  dered to match a
22a90 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e  n ORDER BY term.
22aa0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
22ab0 66 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61  f( (eOp & eqOpMa
22ac0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
22ad0 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
22ae0 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
22af0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
22b00 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
22b10 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
22b20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
22b30 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
22b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22b50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
22b60 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
22b70 20 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20   if( ALWAYS(eOp 
22b80 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20  & WO_IN) ){.    
22b90 20 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59          /* ALWAY
22ba0 53 28 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f  S() justificatio
22bb0 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75  n: eOp is an equ
22bc0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64  ality operator d
22bd0 75 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ue to the.      
22be0 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70        ** j<pLoop
22bf0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f  ->u.btree.nEq co
22c00 6e 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20  nstraint above. 
22c10 20 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74   Any equality ot
22c20 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
22c30 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73  ** than WO_IN is
22c40 20 63 61 70 74 75 72 65 64 20 62 79 20 74 68 65   captured by the
22c50 20 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20   previous "if". 
22c60 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20   So this one.   
22c70 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
22c80 79 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f  ys has to be WO_
22c90 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  IN. */.         
22ca0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c     Expr *pX = pL
22cb0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
22cc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
22cd0 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c     for(i=j+1; i<
22ce0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
22cf0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; i++){.      
22d00 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f          if( pLoo
22d10 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45  p->aLTerm[i]->pE
22d20 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20  xpr==pX ){.     
22d30 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
22d40 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t( (pLoop->aLTer
22d50 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  m[i]->eOperator 
22d60 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20  & WO_IN) );.    
22d70 20 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63              bOnc
22d80 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
22d90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22da0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22db0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22dd0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
22de0 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
22df0 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
22e00 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
22e10 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
22e20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
22e30 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
22e40 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
22e50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22e60 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b     if( pIndex ){
22e70 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
22e80 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
22e90 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
22ea0 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
22eb0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
22ec0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
22ed0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
22ee0 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
22ef0 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f   ) iColumn = XN_
22f00 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  ROWID;.        }
22f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22f20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57  iColumn = XN_ROW
22f30 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ID;.          re
22f40 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
22f50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
22f60 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
22f70 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
22f80 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
22f90 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
22fa0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
22fb0 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
22fc0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
22fd0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
22fe0 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
22ff0 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
23000 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
23010 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
23020 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
23030 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
23040 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
23050 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
23060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
23070 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
23080 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
23090 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
230a0 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
230b0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
230c0 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
230d0 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
230e0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
230f0 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
23100 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
23110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23120 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
23130 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
23140 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
23150 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
23160 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
23170 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
23180 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
23190 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
231a0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
231b0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
231c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
231d0 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
231e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
231f0 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
23200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
23210 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23220 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
23230 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
23240 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
23250 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
23260 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
23270 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
23280 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
23290 6d 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn>=XN_ROWID ){.
232a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
232b0 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
232c0 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
232d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
232e0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
232f0 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
23300 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
23310 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
23320 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
23330 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23350 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 49          Expr *pI
23360 64 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d  dxExpr = pIndex-
23370 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
23380 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
23390 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
233a0 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 4f  prCompareSkip(pO
233b0 42 45 78 70 72 2c 20 70 49 64 78 45 78 70 72 2c  BExpr, pIdxExpr,
233c0 20 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20   iCur) ){.      
233d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
233e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
233f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23400 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
23410 6e 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20  n!=XN_ROWID ){. 
23420 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
23430 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
23440 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
23450 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
23460 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
23470 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
23480 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
23490 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
234a0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
234b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
234c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
234d0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
234e0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
234f0 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 20  NCTBY ){.       
23500 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
23510 72 65 65 2e 6e 44 69 73 74 69 6e 63 74 43 6f 6c  ree.nDistinctCol
23520 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20   = j+1;.        
23530 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73    }.          is
23540 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
23550 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23560 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23570 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63  ( isMatch && (wc
23580 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23590 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
235a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
235b0 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
235c0 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
235d0 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
235e0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
235f0 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
23600 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
23610 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
23620 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
23630 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20       if( revSet 
23640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23650 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
23660 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
23670 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73  ].sortOrder ) is
23680 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
23690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
236a0 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
236b0 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
236c0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
236d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
236e0 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b   rev ) *pRevMask
236f0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f   |= MASKBIT(iLoo
23700 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
23710 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
23720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23730 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
23740 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
23750 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
23760 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  XN_ROWID ){.    
23770 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23780 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
23790 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
237a0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
237b0 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
237c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
237d0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
237e0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
237f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
23800 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
23810 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
23820 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
23830 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
23840 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
23850 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
23860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
23870 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
23880 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23890 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
238a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
238b0 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
238c0 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
238d0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
238e0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
238f0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
23900 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
23910 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
23920 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
23930 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
23940 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
23950 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
23960 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
23970 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
23980 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
23990 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
239a0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
239b0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
239c0 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
239d0 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
239e0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
239f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
23a00 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
23a10 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
23a20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
23a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
23a40 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
23a50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23a60 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
23a70 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
23a80 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
23a90 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
23aa0 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
23ab0 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
23ac0 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
23ad0 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
23ae0 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
23af0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23b00 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
23b10 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
23b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23b30 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
23b40 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
23b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23b60 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
23b70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
23b80 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
23b90 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
23ba0 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
23bb0 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
23bc0 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
23bd0 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
23be0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
23bf0 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
23c00 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
23c10 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
23c20 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
23c30 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
23c40 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
23c50 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
23c60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
23c70 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
23c80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
23c90 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
23ca0 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
23cb0 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
23cc0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
23cd0 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
23ce0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
23cf0 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
23d00 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
23d10 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
23d20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
23d30 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
23d40 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
23d50 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
23d60 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
23d70 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
23d80 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
23d90 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
23da0 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
23db0 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
23dc0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
23dd0 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
23de0 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
23df0 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
23e00 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
23e10 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
23e20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
23e30 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
23e40 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
23e50 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
23e60 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
23e70 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
23e80 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
23e90 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
23ea0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
23eb0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
23ec0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
23ed0 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
23ee0 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
23ef0 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
23f00 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
23f10 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
23f20 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
23f30 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
23f40 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
23f50 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
23f60 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
23f70 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
23f80 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
23f90 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
23fa0 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
23fb0 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
23fc0 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
23fd0 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
23fe0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
23ff0 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
24000 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
24010 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
24020 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
24030 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
24040 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
24050 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
24060 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24070 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
24080 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
24090 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
240a0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
240b0 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
240c0 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
240d0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
240e0 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
240f0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
24100 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
24110 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
24120 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
24130 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
24140 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
24150 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
24160 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
24170 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
24180 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
24190 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
241a0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
241b0 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
241c0 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
241d0 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
241e0 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
241f0 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
24200 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
24210 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
24220 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
24230 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
24240 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
24250 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
24260 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
24270 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
24280 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
24290 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
242a0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
242b0 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
242c0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
242d0 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
242e0 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
242f0 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
24300 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
24310 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
24320 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
24330 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
24340 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
24350 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
24360 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
24370 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
24380 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
24390 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
243a0 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
243b0 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
243c0 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
243d0 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
243e0 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
243f0 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
24400 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
24410 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
24420 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
24430 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
24440 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
24450 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
24460 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
24470 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
24480 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
24490 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
244a0 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
244b0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
244c0 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
244d0 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
244e0 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
244f0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
24500 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
24510 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
24520 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
24530 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
24540 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
24550 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20  nRow + rScale + 
24560 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70  16;..  /* Multip
24570 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65  le by log(M) whe
24580 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
24590 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
245a0 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
245b0 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69  LIMIT for M if i
245c0 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a  t is smaller */.
245d0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
245e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
245f0 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20  E_USE_LIMIT)!=0 
24600 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69  && pWInfo->iLimi
24610 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52  t<nRow ){.    nR
24620 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  ow = pWInfo->iLi
24630 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74  mit;.  }.  rSort
24640 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e  Cost += estLog(n
24650 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Row);.  return r
24660 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a  SortCost;.}../*.
24670 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
24680 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
24690 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
246a0 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
246b0 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
246c0 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
246d0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
246e0 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
246f0 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
24700 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
24710 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
24720 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
24730 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
24740 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
24750 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
24760 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
24770 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
24780 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
24790 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
247a0 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
247b0 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
247c0 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
247d0 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
247e0 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
247f0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
24800 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
24810 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
24820 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
24830 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
24840 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
24850 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
24860 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
24870 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73  o *pWInfo, LogEs
24880 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e  t nRowEst){.  in
24890 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20  t mxChoice;     
248a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
248b0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  um number of sim
248c0 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20  ultaneous paths 
248d0 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  tracked */.  int
248e0 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nLoop;         
248f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24900 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
24910 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65   join */.  Parse
24920 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
24930 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
24940 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
24950 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
24960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
24970 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24980 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
24990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
249a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
249b0 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
249c0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
249d0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
249e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
249f0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
24a00 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20   int mxI = 0;   
24a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24a20 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72  dex of next entr
24a30 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a  y to replace */.
24a40 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
24a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24a60 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
24a70 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a  Y clause terms *
24a80 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
24a90 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
24aa0 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
24ab0 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
24ac0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e  */.  LogEst mxUn
24ad0 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f  sorted = 0;    /
24ae0 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74  * Maximum unsort
24af0 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  ed cost of a set
24b00 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e   of path */.  in
24b10 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
24b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24b30 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
24b40 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
24b50 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
24b60 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
24b70 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
24b80 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
24b90 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
24ba0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
24bb0 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
24bc0 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
24bd0 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
24be0 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
24bf0 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
24c00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
24c10 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
24c20 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
24c30 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
24c40 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
24c50 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
24c60 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
24c70 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
24c80 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
24c90 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
24ca0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
24cb0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
24cc0 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
24cd0 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
24ce0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
24cf0 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
24d00 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f  e memory */.  Lo
24d10 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20  gEst *aSortCost 
24d20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69  = 0;    /* Sorti
24d30 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73  ng and partial s
24d40 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a  orting costs */.
24d50 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
24d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24d70 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
24d80 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
24d90 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tine */.  int nS
24da0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
24db0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
24dc0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
24dd0 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20  at pSpace */..  
24de0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
24df0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
24e00 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
24e10 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
24e20 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
24e30 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
24e40 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
24e50 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
24e60 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
24e70 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
24e80 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
24e90 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
24ea0 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
24eb0 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
24ec0 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
24ed0 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
24ee0 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31  oice = (nLoop<=1
24ef0 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
24f00 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
24f10 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
24f20 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
24f30 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
24f40 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
24f50 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e  -- begin solver.
24f60 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e    (nRowEst=%d)\n
24f70 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20  ", nRowEst));.. 
24f80 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69   /* If nRowEst i
24f90 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65  s zero and there
24fa0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
24fb0 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69  clause, ignore i
24fc0 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20  t. In this.  ** 
24fd0 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65  case the purpose
24fe0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   of this call is
24ff0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
25000 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
25010 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79  returned.  ** by
25020 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65   the overall que
25030 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73  ry. Once this es
25040 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20  timate has been 
25050 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61  obtained, the ca
25060 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69  ller.  ** will i
25070 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
25080 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ion a second tim
25090 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65  e, passing the e
250a0 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20  stimate as the. 
250b0 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61   ** nRowEst para
250c0 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  meter.  */.  if(
250d0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
250e0 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
250f0 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72  =0 ){.    nOrder
25100 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  By = 0;.  }else{
25110 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
25120 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25130 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20  ->nExpr;.  }..  
25140 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
25150 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
25160 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20   for aTo, aFrom 
25170 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  and aSortCost[] 
25180 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73  */.  nSpace = (s
25190 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
251a0 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
251b0 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
251c0 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20  ice*2;.  nSpace 
251d0 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
251e0 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ) * nOrderBy;.  
251f0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
25200 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
25210 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28  , nSpace);.  if(
25220 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74   pSpace==0 ) ret
25230 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
25240 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28  _BKPT;.  aTo = (
25250 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
25260 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
25270 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
25280 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
25290 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
252a0 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
252b0 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
252c0 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
252d0 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
252e0 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
252f0 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
25300 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
25310 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
25320 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
25330 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
25340 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
25350 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
25360 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
25370 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
25380 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
25390 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
253a0 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
253b0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
253c0 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
253d0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
253e0 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
253f0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
25400 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
25410 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
25420 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
25430 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
25440 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
25450 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
25460 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
25470 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
25480 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
25490 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
254a0 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
254b0 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
254c0 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
254d0 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
254e0 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
254f0 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
25500 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
25510 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
25520 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
25530 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
25540 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
25550 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
25560 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
25570 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
25580 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
25590 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
255a0 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
255b0 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
255c0 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
255d0 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
255e0 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
255f0 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
25600 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
25610 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74   above 28.  If t
25620 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
25630 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
25640 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
25650 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
25660 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
25670 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  8.  ** rows, the
25680 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
25690 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
256a0 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
256b0 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
256c0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
256d0 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d  8);  assert( 48=
256e0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
256f0 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  8) );.  nFrom = 
25700 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
25710 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
25720 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
25730 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
25740 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
25750 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
25760 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
25770 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
25780 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
25790 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
257a0 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
257b0 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
257c0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
257d0 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
257e0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
257f0 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
25800 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
25810 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
25820 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
25830 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
25840 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
25850 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
25860 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
25870 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
25880 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
25890 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
258a0 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
258b0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
258c0 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
258d0 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
258e0 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
258f0 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
25900 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
25910 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
25920 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
25930 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
25940 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
25950 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
25960 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
25970 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
25980 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
25990 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
259a0 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
259b0 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
259c0 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
259d0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
259e0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
259f0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
25a00 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
25a10 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
25a20 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
25a30 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
25a40 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
25a50 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
25a60 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
25a70 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
25a80 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
25a90 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
25aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
25ab0 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
25ac0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
25ad0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
25ae0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
25af0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
25b00 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
25b10 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
25b20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
25b30 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
25b40 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
25b50 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
25b60 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
25b70 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
25b80 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
25b90 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
25ba0 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
25bb0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
25bc0 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
25bf0 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
25c00 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
25c10 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c30 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
25c40 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
25c50 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
25c60 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
25c70 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
25c80 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
25c90 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
25ca0 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
25cb0 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
25cc0 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
25cd0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
25ce0 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  (pWLoop->wsFlags
25cf0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
25d00 44 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d  DEX)!=0 && pFrom
25d10 2d 3e 6e 52 6f 77 3c 33 20 29 7b 0a 20 20 20 20  ->nRow<3 ){.    
25d20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
25d30 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  use an automatic
25d40 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68   index if the th
25d50 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63  is loop is expec
25d60 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
25d70 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61   to run less tha
25d80 6e 20 31 2e 32 35 20 74 69 6d 65 73 2e 20 20 49  n 1.25 times.  I
25d90 74 20 69 73 20 74 65 6d 70 74 69 6e 67 20 74 6f  t is tempting to
25da0 20 61 6c 73 6f 20 65 78 63 6c 75 64 65 0a 20 20   also exclude.  
25db0 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
25dc0 61 74 69 63 20 69 6e 64 65 78 20 75 73 61 67 65  atic index usage
25dd0 20 6f 6e 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f   on an outer loo
25de0 70 2c 20 62 75 74 20 73 6f 6d 65 74 69 6d 65 73  p, but sometimes
25df0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 0a 20 20   an automatic.  
25e00 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
25e10 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 74 68   is useful in th
25e20 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 6f 66 20  e outer loop of 
25e30 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
25e40 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20  query. */.      
25e50 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d      assert( 10==
25e60 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
25e70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
25e80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25e90 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  }..        /* At
25ea0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
25eb0 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
25ec0 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
25ed0 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
25ee0 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
25ef0 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
25f00 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69  rUnsorted = sqli
25f10 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
25f20 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
25f30 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
25f40 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
25f50 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
25f60 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
25f70 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e  nsorted, pFrom->
25f80 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20  rUnsorted);.    
25f90 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d      nOut = pFrom
25fa0 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
25fb0 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d  >nOut;.        m
25fc0 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e  askNew = pFrom->
25fd0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
25fe0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
25ff0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
26000 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed<0 ){.        
26010 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68    isOrdered = wh
26020 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
26030 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a  OrderBy(pWInfo,.
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
26060 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20  OrderBy, pFrom, 
26070 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
26080 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
26090 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70             iLoop
260a0 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61  , pWLoop, &revMa
260b0 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  sk);.        }el
260c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
260d0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
260e0 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
260f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
26100 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73  Ordered>=0 && is
26110 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79  Ordered<nOrderBy
26120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
26130 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  ( aSortCost[isOr
26140 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20  dered]==0 ){.   
26150 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
26160 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20  st[isOrdered] = 
26170 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
26180 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
26190 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73    pWInfo, nRowEs
261a0 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f  t, nOrderBy, isO
261b0 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20  rdered.         
261c0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
261d0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  }.          /* T
261e0 55 4e 49 4e 47 3a 20 20 41 64 64 20 61 20 73 6d  UNING:  Add a sm
261f0 61 6c 6c 20 65 78 74 72 61 20 70 65 6e 61 6c 74  all extra penalt
26200 79 20 28 35 29 20 74 6f 20 73 6f 72 74 69 6e 67  y (5) to sorting
26210 20 61 73 20 61 6e 0a 20 20 20 20 20 20 20 20 20   as an.         
26220 20 2a 2a 20 65 78 74 72 61 20 65 6e 63 6f 75 72   ** extra encour
26230 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 71 75  agment to the qu
26240 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20 73  ery planner to s
26250 65 6c 65 63 74 20 61 20 70 6c 61 6e 0a 20 20 20  elect a plan.   
26260 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
26270 74 68 65 20 72 6f 77 73 20 65 6d 65 72 67 65 20  the rows emerge 
26280 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
26290 72 64 65 72 20 77 69 74 68 6f 75 74 20 61 6e 79  rder without any
262a0 20 73 6f 72 74 69 6e 67 0a 20 20 20 20 20 20 20   sorting.       
262b0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2e 20     ** required. 
262c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f  */.          rCo
262d0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
262e0 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
262f0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
26300 65 72 65 64 5d 29 20 2b 20 35 3b 0a 0a 20 20 20  ered]) + 5;..   
26310 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
26320 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
26330 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f         ("---- so
26340 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64  rt cost=%-3d (%d
26350 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63  /%d) increases c
26360 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c  ost %3d to %-3d\
26370 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
26380 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
26390 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72  rdered], (nOrder
263a0 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e  By-isOrdered), n
263b0 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
263c0 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74           rUnsort
263d0 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20  ed, rCost));.   
263e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
263f0 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55        rCost = rU
26400 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
26410 20 20 20 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20     rUnsorted -= 
26420 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  2;  /* TUNING:  
26430 53 6c 69 67 68 74 20 62 69 61 73 20 69 6e 20 66  Slight bias in f
26440 61 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20  avor of no-sort 
26450 70 6c 61 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  plans */.       
26460 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
26470 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
26480 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
26490 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
264a0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d   of.        ** m
264b0 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d  xChoice best-so-
264c0 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20  far paths..     
264d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
264e0 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20   First look for 
264f0 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  an existing path
26500 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66   among best-so-f
26510 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20  ar paths.       
26520 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20   ** that covers 
26530 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
26540 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
26550 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64  e same isOrdered
26560 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74  .        ** sett
26570 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65  ing as the curre
26580 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74  nt path candidat
26590 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
265a0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72        ** The ter
265b0 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  m "((pTo->isOrde
265c0 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
265d0 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69  x80)==0" is equi
265e0 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  valent.        *
265f0 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  * to (pTo->isOrd
26600 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73  ered==(-1))==(is
26610 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20  Ordered==(-1))" 
26620 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20  for the range.  
26630 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61        ** of lega
26640 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f  l values for isO
26650 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a  rdered, -1..64..
26660 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26670 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
26680 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
26690 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
266a0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
266b0 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
266c0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
266d0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
266e0 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
266f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ==0.          ){
26700 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26710 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31  tcase( jj==nTo-1
26720 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26730 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
26740 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26750 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
26760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26770 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69   None of the exi
26780 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  sting best-so-fa
26790 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68  r paths match th
267a0 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
267b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
267c0 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  o>=mxChoice.    
267d0 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74         && (rCost
267e0 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73  >mxCost || (rCos
267f0 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e  t==mxCost && rUn
26800 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74  sorted>=mxUnsort
26810 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  ed)).          )
26820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
26830 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e   The current can
26840 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74  didate is no bet
26850 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20  ter than any of 
26860 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20  the mxChoice.   
26870 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68           ** path
26880 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
26890 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62  he best-so-far b
268a0 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61  uffer.  So disca
268b0 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  rd.            *
268c0 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65  * this candidate
268d0 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20   as not viable. 
268e0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
268f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
26900 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
26910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
26920 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
26930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26940 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26950 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
26960 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
26970 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
26990 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
269a0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
269b0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72  , rCost, nOut, r
269c0 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20  Unsorted,.      
269d0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
269e0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
269f0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
26a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
26a10 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
26a20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26a40 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
26a50 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
26a60 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
26a70 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
26a80 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
26a90 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
26aa0 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
26ab0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
26ac0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
26ad0 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
26ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
26af0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
26b00 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
26b10 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
26b20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
26b30 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
26b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26b50 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
26b60 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
26b70 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
26b80 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
26b90 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
26ba0 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
26bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26bc0 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
26bd0 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
26be0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
26bf0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
26c00 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26c10 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
26c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26c30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
26c40 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
26c50 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
26c60 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
26c70 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
26c80 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
26c90 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
26ca0 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74  t, nOut, rUnsort
26cb0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
26cc0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
26cd0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
26ce0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
26cf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d10 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
26d20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
26d30 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
26d40 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76   pTo=aTo[jj] cov
26d50 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ers the.        
26d60 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66    ** same set of
26d70 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
26d80 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
26d90 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
26da0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
26db0 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
26dc0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
26dd0 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
26de0 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
26df0 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
26e00 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
26e10 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
26e20 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ed..          **
26e30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54   .          ** T
26e40 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69  he conditional i
26e50 73 20 61 6e 20 65 78 70 61 6e 64 65 64 20 76 65  s an expanded ve
26e60 63 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ctor comparison 
26e70 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
26e80 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 70           **   (p
26e90 54 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e  To->rCost,pTo->n
26ea0 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74  Row,pTo->rUnsort
26eb0 65 64 29 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f  ed) <= (rCost,nO
26ec0 75 74 2c 72 55 6e 73 6f 72 74 65 64 29 0a 20 20  ut,rUnsorted).  
26ed0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26ee0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
26ef0 6f 73 74 3c 72 43 6f 73 74 20 0a 20 20 20 20 20  ost<rCost .     
26f00 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
26f10 43 6f 73 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20  Cost==rCost.    
26f20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
26f30 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20  To->nRow<nOut.  
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f50 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d   || (pTo->nRow==
26f60 6e 4f 75 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  nOut && pTo->rUn
26f70 73 6f 72 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65  sorted<=rUnsorte
26f80 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
26f90 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
26fa0 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
26fb0 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
26fc0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
26fd0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
26fe0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
26ff0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
27000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
27010 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27020 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
27030 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
27040 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
27050 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
27070 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
27080 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
27090 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
270a0 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20   rUnsorted,.    
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
270c0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
270d0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
270e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
270f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27100 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
27110 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
27120 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
27140 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
27150 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
27160 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
27170 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
27180 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
27190 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f  sorted, pTo->isO
271a0 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
271b0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
271c0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
271d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
271e0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61          /* Disca
271f0 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  rd the candidate
27200 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68   path from furth
27210 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
27220 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27230 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
27240 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
27250 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
27260 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
27270 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
27280 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
27290 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
272a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
272b0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
272c0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
272d0 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68  ath is better th
272e0 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  an the.         
272f0 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52   ** pTo path.  R
27300 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20  eplace pTo with 
27310 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
27320 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
27330 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
27340 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
27350 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
27360 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
27370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27380 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
273a0 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
273b0 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
273c0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
273d0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
273e0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
273f0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
27400 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64   nOut, rUnsorted
27410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27420 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
27430 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
27440 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
27450 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27460 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
27470 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
27480 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
274a0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
274b0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
274c0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
274d0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
274e0 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f        pTo->rUnso
274f0 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64  rted, pTo->isOrd
27500 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
27510 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
27520 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
27530 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27540 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
27550 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
27560 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
27570 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
27580 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
27590 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
275a0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
275b0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
275c0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
275d0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
275e0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
275f0 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
27600 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
27610 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
27620 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
27630 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
27640 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
27650 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
27660 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
27670 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
27680 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
27690 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
276a0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
276b0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
276c0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
276d0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
276e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
276f0 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
27700 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
27710 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
27720 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
27730 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
27740 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
27750 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
27760 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
27770 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
27780 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
27790 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
277a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
277b0 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
277c0 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
277d0 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
277e0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
277f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
27800 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
27810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
27820 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
27830 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
27840 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
27850 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
27860 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
27870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27880 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
27890 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
278a0 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
278b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
278c0 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
278d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
278e0 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
278f0 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
27900 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
27910 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
27920 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
27930 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
27940 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27950 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
27960 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
27970 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
27980 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
27990 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
279a0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
279b0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
279c0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
279d0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
279e0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
279f0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
27a00 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
27a10 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
27a20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27a30 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
27a40 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
27a50 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
27a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27a70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27a80 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
27a90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27aa0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
27ab0 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
27ac0 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
27ad0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
27ae0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
27af0 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
27b00 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
27b10 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
27b20 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
27b30 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
27b40 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
27b50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27b60 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
27b70 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
27b80 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
27b90 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
27ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27bb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
27bc0 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
27bd0 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
27be0 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
27bf0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
27c00 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
27c10 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
27c20 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
27c30 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
27c40 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
27c50 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
27c60 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
27c70 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
27c80 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
27c90 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
27ca0 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
27cb0 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
27cc0 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
27cd0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
27ce0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
27cf0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
27d00 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
27d10 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
27d20 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
27d30 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
27d40 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
27d50 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
27d60 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
27d70 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
27d80 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
27d90 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
27da0 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
27db0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
27dc0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27dd0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
27de0 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
27df0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27e00 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
27e10 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
27e20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
27e30 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
27e40 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
27e50 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
27e60 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
27e70 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
27e80 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
27e90 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
27ea0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
27eb0 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
27ec0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
27ed0 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
27ee0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
27ef0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
27f00 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
27f10 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  c==pWInfo->pResu
27f20 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  ltSet->nExpr ){.
27f30 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
27f40 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
27f50 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
27f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57  ;.    }.  }.  pW
27f70 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Info->bOrderedIn
27f80 6e 65 72 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 69  nerLoop = 0;.  i
27f90 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
27fa0 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rBy ){.    if( p
27fb0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
27fc0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
27fd0 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66  CTBY ){.      if
27fe0 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
27ff0 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ed==pWInfo->pOrd
28000 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
28010 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65         pWInfo->e
28020 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
28030 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
28040 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
28050 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
28060 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72  fo->nOBSat = pFr
28070 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
28080 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
28090 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
280a0 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  vLoop;.      if(
280b0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c   pWInfo->nOBSat<
280c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  =0 ){.        pW
280d0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30  Info->nOBSat = 0
280e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c  ;.        if( nL
280f0 6f 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  oop>0 ){.       
28100 20 20 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d     u32 wsFlags =
28110 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
28120 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b  oop-1]->wsFlags;
28130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
28140 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28150 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20  ONEROW)==0 .    
28160 20 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61         && (wsFla
28170 67 73 26 28 57 48 45 52 45 5f 49 50 4b 7c 57 48  gs&(WHERE_IPK|WH
28180 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21  ERE_COLUMN_IN))!
28190 3d 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  =(WHERE_IPK|WHER
281a0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20  E_COLUMN_IN).   
281b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
281c0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
281d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
281e0 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
281f0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
28200 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
28210 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
28220 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
28230 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
28240 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20  _ORDERBY_LIMIT, 
28250 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
28260 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
28270 26 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &m);.           
28280 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61   testcase( wsFla
28290 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
282a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
282b0 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
282c0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
282d0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  N );.           
282e0 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d   if( rc==pWInfo-
282f0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
28300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28310 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72    pWInfo->bOrder
28320 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b  edInnerLoop = 1;
28330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28340 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
28350 20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   m;.            
28360 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
28370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28380 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
28390 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
283a0 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
283b0 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26  GROUP).        &
283c0 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  & pWInfo->nOBSat
283d0 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
283e0 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f  By->nExpr && nLo
283f0 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  op>0.    ){.    
28400 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
28410 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
28420 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50   nOrder = whereP
28430 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
28440 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
28450 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  fo->pOrderBy, . 
28460 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20           pFrom, 
28470 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  0, nLoop-1, pFro
28480 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
28490 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20  ], &revMask.    
284a0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
284b0 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65  t( pWInfo->sorte
284c0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  d==0 );.      if
284d0 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f  ( nOrder==pWInfo
284e0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
284f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  r ){.        pWI
28500 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b  nfo->sorted = 1;
28510 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
28520 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61  >revMask = revMa
28530 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
28540 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f  }.  }...  pWInfo
28550 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f  ->nRowOut = pFro
28560 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46  m->nRow;..  /* F
28570 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65  ree temporary me
28580 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20  mory and return 
28590 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c  success */.  sql
285a0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
285b0 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
285c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
285d0 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
285e0 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
285f0 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
28600 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
28610 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
28620 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
28630 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
28640 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
28650 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
28660 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
28670 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
28680 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
28690 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
286a0 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
286b0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
286c0 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
286d0 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
286e0 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
286f0 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
28700 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
28710 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
28720 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
28730 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
28740 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
28750 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
28760 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
28770 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
28780 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
28790 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
287a0 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
287b0 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
287c0 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
287d0 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
287e0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
287f0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
28800 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
28810 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
28820 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
28830 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
28840 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
28850 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
28860 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
28870 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
28880 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
28890 78 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  x;..  pWInfo = p
288a0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
288b0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
288c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
288d0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 29  E_OR_SUBCLAUSE )
288e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
288f0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ert( pWInfo->pTa
28900 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29  bList->nSrc>=1 )
28910 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
28920 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
28930 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  .  pTab = pItem-
28940 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56  >pTab;.  if( IsV
28950 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
28960 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
28970 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
28980 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  edBy ) return 0;
28990 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
289a0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
289b0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
289c0 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
289d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
289e0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
289f0 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d    pLoop->nSkip =
28a00 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71   0;.  pTerm = sq
28a10 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
28a20 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
28a30 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  , 0, WO_EQ|WO_IS
28a40 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
28a50 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  m ){.    testcas
28a60 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
28a70 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
28a80 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
28a90 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
28aa0 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
28ab0 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
28ac0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
28ad0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
28ae0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
28af0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
28b00 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
28b10 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
28b20 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
28b30 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
28b40 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
28b50 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65  ;  /* 33==sqlite
28b60 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20  3LogEst(10) */. 
28b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
28b80 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
28b90 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
28ba0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
28bb0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20    int opMask;.  
28bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
28bd0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
28be0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
28bf0 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e  .      if( !IsUn
28c00 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a  iqueIndex(pIdx).
28c10 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
28c20 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
28c30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
28c40 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
28c50 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
28c60 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
28c70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28c80 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e   opMask = pIdx->
28c90 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57  uniqNotNull ? (W
28ca0 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f  O_EQ|WO_IS) : WO
28cb0 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  _EQ;.      for(j
28cc0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
28cd0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
28ce0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
28cf0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
28d00 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c  pWC, iCur, j, 0,
28d10 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a   opMask, pIdx);.
28d20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
28d30 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
28d40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28d50 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28d60 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
28d70 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
28d80 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
28d90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28da0 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
28db0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28dc0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
28dd0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
28de0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
28df0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
28e00 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
28e10 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
28e20 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
28e30 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
28e40 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
28e50 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
28e60 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
28e70 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
28e80 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
28e90 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
28ea0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
28eb0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
28ec0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
28ed0 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
28ee0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
28ef0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
28f00 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
28f10 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
28f20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71  = 39;  /* 39==sq
28f30 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20  lite3LogEst(15) 
28f40 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
28f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28f60 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
28f70 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
28f80 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20  t = (LogEst)1;. 
28f90 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
28fa0 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a  pWLoop = pLoop;.
28fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
28fc0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d  fo->sMaskSet.n==
28fd0 31 20 26 26 20 69 43 75 72 3d 3d 70 57 49 6e 66  1 && iCur==pWInf
28fe0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30  o->sMaskSet.ix[0
28ff0 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ] );.    pLoop->
29000 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a  maskSelf = 1; /*
29010 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
29020 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
29030 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 2a  askSet, iCur); *
29040 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  /.    pWInfo->a[
29050 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
29060 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
29070 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
29080 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
29090 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
290a0 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d  OBSat =  pWInfo-
290b0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
290c0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
290d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
290e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
290f0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
29100 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
29110 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
29120 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
29130 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29140 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
29150 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
29160 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
29170 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29180 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
29190 74 69 6f 6e 20 66 6f 72 20 65 78 70 72 49 73 44  tion for exprIsD
291a0 65 74 65 72 6d 69 6e 69 73 74 69 63 28 29 2e 0a  eterministic()..
291b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
291c0 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e  prNodeIsDetermin
291d0 69 73 74 69 63 28 57 61 6c 6b 65 72 20 2a 70 57  istic(Walker *pW
291e0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
291f0 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
29200 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
29210 4e 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  N && ExprHasProp
29220 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 43  erty(pExpr, EP_C
29230 6f 6e 73 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  onstFunc)==0 ){.
29240 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
29250 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  de = 0;.    retu
29260 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29270 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
29280 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
29290 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
292a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
292b0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d  contains no non-
292c0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51  deterministic SQ
292d0 4c 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e  L .** functions.
292e0 20 44 6f 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   Do not consider
292f0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
29300 69 63 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ic SQL functions
29310 20 74 68 61 74 20 61 72 65 20 0a 2a 2a 20 70 61   that are .** pa
29320 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74  rt of sub-select
29330 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
29340 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
29350 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 45  sDeterministic(E
29360 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
29370 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
29380 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
29390 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
293a0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
293b0 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 44 65  k = exprNodeIsDe
293c0 74 65 72 6d 69 6e 69 73 74 69 63 3b 0a 20 20 77  terministic;.  w
293d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
293e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
293f0 57 61 6c 6b 46 61 69 6c 3b 0a 20 20 73 71 6c 69  WalkFail;.  sqli
29400 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
29410 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
29420 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Code;.}../*.** G
29430 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
29440 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
29450 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
29460 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
29470 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
29480 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
29490 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
294a0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
294b0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
294c0 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
294d0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
294e0 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
294f0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
29500 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
29510 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
29520 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
29530 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
29540 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
29550 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
29560 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
29570 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
29580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
29590 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
295a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
295b0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
295c0 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
295d0 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
295e0 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
295f0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
29600 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
29610 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
29620 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
29630 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
29640 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
29650 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
29660 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
29670 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
29680 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
29690 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
296a0 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
296b0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
296c0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
296d0 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
296e0 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
296f0 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
29700 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
29710 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
29720 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
29730 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
29740 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
29750 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
29760 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
29770 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
29780 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
29790 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
297a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
297b0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
297c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
297d0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
297e0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
297f0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
29800 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
29810 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
29830 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
29840 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
29850 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
29860 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
29870 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
29880 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
29890 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
298a0 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
298b0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
298c0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
298d0 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
298e0 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
298f0 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
29900 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
29910 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
29920 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
29930 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
29940 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
29950 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
29960 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
29970 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
29980 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
29990 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
299a0 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
299b0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
299c0 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
299d0 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
299e0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
299f0 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
29a00 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
29a10 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
29a20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
29a30 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
29a40 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
29a50 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
29a60 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
29a70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
29a80 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
29a90 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
29aa0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
29ab0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
29ac0 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
29ad0 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
29ae0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
29af0 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
29b00 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
29b10 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
29b20 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
29b30 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
29b40 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
29b50 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
29b60 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
29b70 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
29b80 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
29b90 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
29ba0 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
29bb0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
29bc0 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
29bd0 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
29be0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
29bf0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29c00 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
29c10 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
29c20 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
29c30 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
29c40 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
29c50 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
29c60 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
29c70 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
29c80 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
29c90 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
29ca0 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
29cb0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
29cc0 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
29cd0 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
29ce0 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
29cf0 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
29d00 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
29d10 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
29d20 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
29d30 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
29d40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
29d50 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
29d60 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
29d70 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
29d80 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
29d90 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
29da0 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
29db0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
29dc0 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
29dd0 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
29de0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
29df0 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
29e00 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
29e10 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
29e20 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
29e30 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
29e40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
29e50 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
29e60 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
29e70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
29e80 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
29e90 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
29ea0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
29eb0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
29ec0 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
29ed0 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
29ee0 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
29ef0 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
29f00 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
29f10 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
29f20 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
29f30 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
29f40 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
29f50 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
29f60 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
29f70 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
29f80 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
29f90 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
29fa0 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
29fb0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
29fc0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
29fd0 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
29fe0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
29ff0 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
2a000 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
2a010 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
2a020 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
2a030 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
2a040 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
2a050 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
2a060 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
2a070 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
2a080 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
2a090 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
2a0a0 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
2a0b0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
2a0c0 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65  Y clause (or the
2a0d0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2a0e0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
2a0f0 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
2a100 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61   set in wctrlFla
2a110 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20  gs) of a SELECT 
2a120 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20  statement.** if 
2a130 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
2a140 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
2a150 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
2a160 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2a170 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
2a180 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
2a190 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
2a1a0 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
2a1b0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
2a1c0 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d  he iIdxCur param
2a1d0 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73  eter is the curs
2a1e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
2a1f0 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57  index.  If .** W
2a200 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2a210 45 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  E is set, iIdxCu
2a220 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
2a230 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
2a240 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
2a250 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
2a260 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
2a270 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
2a280 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
2a290 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
2a2a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2a2b0 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
2a2c0 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
2a2d0 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
2a2e0 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
2a2f0 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
2a300 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
2a310 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
2a320 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
2a330 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2a340 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
2a350 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
2a360 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
2a370 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
2a380 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
2a390 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2a3a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2a3b0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2a3c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2a3d0 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52  List,      /* FR
2a3e0 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73  OM clause: A lis
2a3f0 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
2a400 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
2a410 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
2a420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a430 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2a440 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2a450 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41  rderBy,     /* A
2a460 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
2a470 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
2a480 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
2a490 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
2a4a0 65 74 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72  et,   /* Query r
2a4b0 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27  esult set.  Req'
2a4c0 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  d for DISTINCT *
2a4d0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
2a4e0 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  gs,         /* T
2a4f0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
2a500 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
2a510 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
2a520 20 69 41 75 78 41 72 67 20 20 20 20 20 20 20 20   iAuxArg        
2a530 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
2a540 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73  _OR_SUBCLAUSE is
2a550 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
2a560 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f      ** If WHERE_
2a590 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20  USE_LIMIT, then 
2a5a0 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74  the limit amount
2a5b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
2a5c0 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
2a5d0 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
2a5e0 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
2a5f0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2a600 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
2a610 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2a620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
2a630 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
2a640 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
2a650 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
2a660 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
2a670 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
2a680 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
2a690 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
2a6a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2a6b0 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
2a6c0 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
2a6d0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
2a6e0 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
2a6f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
2a700 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
2a710 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
2a720 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2a730 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
2a740 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
2a750 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
2a760 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
2a770 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
2a780 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
2a790 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2a7a0 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
2a7b0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
2a7c0 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
2a7d0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2a7e0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
2a7f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
2a800 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
2a810 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2a820 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2a830 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2a840 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
2a850 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2a860 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2a870 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2a880 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a8a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a8b0 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20    u8 bFordelete 
2a8c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
2a8d0 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
2a8e0 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70   or zero, as app
2a8f0 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61  ropriate */..  a
2a900 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
2a910 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2a920 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20  SS_MULTIROW)==0 
2a930 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77 63  || (.        (wc
2a940 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a950 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2a960 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77  )!=0 .     && (w
2a970 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a980 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2a990 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  =0 .  ));..  /* 
2a9a0 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52  Only one of WHER
2a9b0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f  E_OR_SUBCLAUSE o
2a9c0 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  r WHERE_USE_LIMI
2a9d0 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  T */.  assert( (
2a9e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a9f0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2aa00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2aa10 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  || (wctrlFlags &
2aa20 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
2aa30 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61  )==0 );..  /* Va
2aa40 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
2aa50 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
2aa60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
2aa70 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
2aa80 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20  izeof(sWLB));.. 
2aa90 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f   /* An ORDER/GRO
2aaa0 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  UP BY clause of 
2aab0 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72  more than 63 ter
2aac0 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  ms cannot be opt
2aad0 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74  imized */.  test
2aae0 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26  case( pOrderBy &
2aaf0 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
2ab00 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  r==BMS-1 );.  if
2ab10 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
2ab20 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42  rderBy->nExpr>=B
2ab30 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20  MS ) pOrderBy = 
2ab40 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  0;.  sWLB.pOrder
2ab50 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
2ab60 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
2ab70 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69   DISTINCT optimi
2ab80 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  zation if SQLITE
2ab90 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20  _DistinctOpt is 
2aba0 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c  set via.  ** sql
2abb0 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53  ite3_test_ctrl(S
2abc0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2abd0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e  PTIMIZATIONS,...
2abe0 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  ) */.  if( Optim
2abf0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
2ac00 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69  db, SQLITE_Disti
2ac10 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77  nctOpt) ){.    w
2ac20 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48  ctrlFlags &= ~WH
2ac30 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2ac40 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  T;.  }..  /* The
2ac50 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
2ac60 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2ac70 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
2ac80 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
2ac90 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
2aca0 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
2acb0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
2acc0 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
2acd0 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
2ace0 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
2acf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2ad00 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
2ad10 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
2ad20 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
2ad30 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2ad40 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2ad50 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
2ad60 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
2ad70 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
2ad80 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
2ad90 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
2ada0 68 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  he WHERE_OR_SUBC
2adb0 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65  LAUSE flag is se
2adc0 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
2add0 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
2ade0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2adf0 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
2ae00 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
2ae10 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
2ae20 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
2ae30 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
2ae40 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
2ae50 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
2ae60 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
2ae70 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
2ae80 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2ae90 53 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  SE) ? 1 : pTabLi
2aea0 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
2aeb0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2aec0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
2aed0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
2aee0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
2aef0 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
2af00 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
2af10 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
2af20 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
2af30 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
2af40 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
2af50 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
2af60 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
2af70 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2af80 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
2af90 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
2afa0 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
2afb0 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
2afc0 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
2afd0 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
2afe0 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
2aff0 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
2b000 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
2b010 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
2b020 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
2b030 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
2b040 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
2b050 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
2b060 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
2b070 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
2b080 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2b090 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
2b0a0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2b0b0 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  NN(db, nByteWInf
2b0c0 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
2b0d0 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
2b0e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2b0f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2b100 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2b110 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
2b120 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2b130 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
2b140 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
2b150 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
2b160 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
2b170 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2b180 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
2b190 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
2b1a0 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
2b1b0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65  e;.  pWInfo->pRe
2b1c0 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c  sultSet = pResul
2b1d0 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
2b1e0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
2b1f0 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
2b200 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
2b210 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
2b220 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
2b230 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
2b240 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
2b250 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
2b260 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
2b270 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
2b280 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
2b290 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ags;.  pWInfo->i
2b2a0 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b  Limit = iAuxArg;
2b2b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
2b2c0 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
2b2d0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
2b2e0 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66  .  memset(&pWInf
2b2f0 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20  o->nOBSat, 0, . 
2b300 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66          offsetof
2b310 28 57 68 65 72 65 49 6e 66 6f 2c 73 57 43 29 20  (WhereInfo,sWC) 
2b320 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65  - offsetof(Where
2b330 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20  Info,nOBSat));. 
2b340 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d   memset(&pWInfo-
2b350 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[0], 0, sizeof
2b360 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62  (WhereLoop)+nTab
2b370 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57 68 65 72  List*sizeof(Wher
2b380 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73 73 65  eLevel));.  asse
2b390 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  rt( pWInfo->eOne
2b3a0 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2b3b0 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53  F );  /* ONEPASS
2b3c0 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46   defaults to OFF
2b3d0 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d   */.  pMaskSet =
2b3e0 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
2b3f0 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66  et;.  sWLB.pWInf
2b400 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57  o = pWInfo;.  sW
2b410 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  LB.pWC = &pWInfo
2b420 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e  ->sWC;.  sWLB.pN
2b430 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  ew = (WhereLoop*
2b440 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f  )(((char*)pWInfo
2b450 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20  )+nByteWInfo);. 
2b460 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2b470 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57  YTE_ALIGNMENT(sW
2b480 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68  LB.pNew) );.  wh
2b490 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
2b4a0 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
2b4b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
2b4c0 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
2b4d0 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
2b4e0 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
2b4f0 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
2b500 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
2b510 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
2b520 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
2b530 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
2b540 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
2b550 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
2b560 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
2b570 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
2b580 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e  ClauseInit(&pWIn
2b590 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29  fo->sWC, pWInfo)
2b5a0 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
2b5b0 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
2b5c0 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
2b5d0 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53  ND);.    .  /* S
2b5e0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
2b5f0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
2b600 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
2b610 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
2b620 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
2b630 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72  >nOBSat = pOrder
2b640 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
2b650 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2b660 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2b670 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
2b680 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
2b690 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2b6a0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
2b6b0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
2b6c0 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22  an((pParse, 0, "
2b6d0 53 43 41 4e 20 43 4f 4e 53 54 41 4e 54 20 52 4f  SCAN CONSTANT RO
2b6e0 57 22 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  W"));.  }else{. 
2b6f0 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62     /* Assign a b
2b700 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
2b710 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
2b720 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
2b730 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ause..    **.   
2b740 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65 72   ** The N-th ter
2b750 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
2b760 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65 64  ause is assigned
2b770 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c   a bitmask of 1<
2b780 3c 4e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <N..    **.    *
2b790 2a 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68  * The rule of th
2b7a0 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
2b7b0 6e 63 65 20 65 6e 73 75 72 65 73 20 74 68 74 61  nce ensures thta
2b7c0 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
2b7d0 6d 61 73 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  mask for.    ** 
2b7e0 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  a table T, then 
2b7f0 58 2d 31 20 69 73 20 74 68 65 20 62 69 74 6d 61  X-1 is the bitma
2b800 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72  sk for all other
2b810 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2b820 65 66 74 20 6f 66 20 54 2e 0a 20 20 20 20 2a 2a  eft of T..    **
2b830 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
2b840 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
2b850 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
2b860 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
2b870 73 0a 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61  s.    ** importa
2b880 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
2b890 35 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  5..    **.    **
2b8a0 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
2b8b0 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
2b8c0 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
2b8d0 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
2b8e0 0a 20 20 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  .    ** pTabList
2b8f0 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
2b900 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
2b910 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
2b920 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 20 20  is normally.    
2b930 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
2b940 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
2b950 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
2b960 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
2b970 20 20 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55    ** WHERE_OR_SU
2b980 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20  BCLAUSE flag is 
2b990 73 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  set..    */.    
2b9a0 69 69 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a  ii = 0;.    do{.
2b9b0 20 20 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b        createMask
2b9c0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2b9d0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
2b9e0 6f 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  or);.      sqlit
2b9f0 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72  e3WhereTabFuncAr
2ba00 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61 62  gs(pParse, &pTab
2ba10 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57  List->a[ii], &pW
2ba20 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
2ba30 7d 77 68 69 6c 65 28 20 28 2b 2b 69 69 29 3c 70  }while( (++ii)<p
2ba40 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2ba50 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
2ba60 5f 44 45 42 55 47 0a 20 20 20 20 7b 0a 20 20 20  _DEBUG.    {.   
2ba70 20 20 20 42 69 74 6d 61 73 6b 20 6d 78 20 3d 20     Bitmask mx = 
2ba80 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  0;.      for(ii=
2ba90 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
2baa0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
2bab0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
2bac0 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
2bad0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2bae0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2baf0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
2bb00 20 61 73 73 65 72 74 28 20 6d 3e 3d 6d 78 20 29   assert( m>=mx )
2bb10 3b 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 6d  ;.        mx = m
2bb20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bb30 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a    #endif.  }.  .
2bb40 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
2bb50 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
2bb60 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c  ssions. */.  sql
2bb70 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61  ite3WhereExprAna
2bb80 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26  lyze(pTabList, &
2bb90 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
2bba0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2bbb0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2bbc0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
2bbd0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
2bbe0 20 57 48 45 52 45 20 74 65 72 6d 73 20 74 68 61   WHERE terms tha
2bbf0 74 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  t do not refer t
2bc00 6f 20 61 6e 79 20 74 61 62 6c 65 73 20 69 6e 20  o any tables in 
2bc10 74 68 65 20 6a 6f 69 6e 0a 20 20 2a 2a 20 28 63  the join.  ** (c
2bc20 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
2bc30 6f 6e 73 29 2e 20 45 76 61 6c 75 61 74 65 20 65  ons). Evaluate e
2bc40 61 63 68 20 73 75 63 68 20 74 65 72 6d 2c 20 61  ach such term, a
2bc50 6e 64 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  nd jump over all
2bc60 20 74 68 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61   the.  ** genera
2bc70 74 65 64 20 63 6f 64 65 20 69 66 20 74 68 65 20  ted code if the 
2bc80 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 74 72  result is not tr
2bc90 75 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ue.  .  **.  ** 
2bca0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  Do not do this i
2bcb0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2bcc0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 64 65   contains non-de
2bcd0 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63  terministic func
2bce0 74 69 6f 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  tions.  ** that 
2bcf0 61 72 65 20 6e 6f 74 20 77 69 74 68 69 6e 20 61  are not within a
2bd00 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69   sub-select. Thi
2bd10 73 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  s is not strictl
2bd20 79 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 0a  y required, but.
2bd30 20 20 2a 2a 20 70 72 65 73 65 72 76 65 73 20 53    ** preserves S
2bd40 51 4c 69 74 65 27 73 20 6c 65 67 61 63 79 20 62  QLite's legacy b
2bd50 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65 20  ehaviour in the 
2bd60 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 63 61  following two ca
2bd70 73 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ses:.  **.  **  
2bd80 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20   FROM ... WHERE 
2bd90 72 61 6e 64 6f 6d 28 29 3e 30 3b 20 20 20 20 20  random()>0;     
2bda0 20 20 20 20 20 20 2d 2d 20 65 76 61 6c 20 72 61        -- eval ra
2bdb0 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 70 65 72 20  ndom() once per 
2bdc0 72 6f 77 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20  row.  **   FROM 
2bdd0 2e 2e 2e 20 57 48 45 52 45 20 28 53 45 4c 45 43  ... WHERE (SELEC
2bde0 54 20 72 61 6e 64 6f 6d 28 29 29 3e 30 3b 20 20  T random())>0;  
2bdf0 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29  -- eval random()
2be00 20 6f 6e 63 65 20 6f 76 65 72 61 6c 6c 0a 20 20   once overall.  
2be10 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
2be20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
2be30 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 57 68  m; ii++){.    Wh
2be40 65 72 65 54 65 72 6d 20 2a 70 54 20 3d 20 26 73  ereTerm *pT = &s
2be50 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 3b 0a  WLB.pWC->a[ii];.
2be60 20 20 20 20 69 66 28 20 70 54 2d 3e 77 74 46 6c      if( pT->wtFl
2be70 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
2be80 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
2be90 20 20 20 69 66 28 20 70 54 2d 3e 70 72 65 72 65     if( pT->prere
2bea0 71 41 6c 6c 3d 3d 30 20 26 26 20 28 6e 54 61 62  qAll==0 && (nTab
2beb0 4c 69 73 74 3d 3d 30 20 7c 7c 20 65 78 70 72 49  List==0 || exprI
2bec0 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 70  sDeterministic(p
2bed0 54 2d 3e 70 45 78 70 72 29 29 20 29 7b 0a 20 20  T->pExpr)) ){.  
2bee0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2bef0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2bf00 54 2d 3e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f  T->pExpr, pWInfo
2bf10 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45  ->iBreak, SQLITE
2bf20 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2bf30 20 20 20 20 70 54 2d 3e 77 74 46 6c 61 67 73 20      pT->wtFlags 
2bf40 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
2bf50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2bf60 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2bf70 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2bf80 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69   ){.    if( isDi
2bf90 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
2bfa0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2bfb0 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  , &pWInfo->sWC, 
2bfc0 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20  pResultSet) ){. 
2bfd0 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54       /* The DIST
2bfe0 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20  INCT marking is 
2bff0 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f  pointless.  Igno
2c000 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  re it. */.      
2c010 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2c020 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
2c030 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
2c040 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42  else if( pOrderB
2c050 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y==0 ){.      /*
2c060 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59   Try to ORDER BY
2c070 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2c080 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74  to make distinct
2c090 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69   processing easi
2c0a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  er */.      pWIn
2c0b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c  fo->wctrlFlags |
2c0c0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2c0d0 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  BY;.      pWInfo
2c0e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65  ->pOrderBy = pRe
2c0f0 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20  sultSet;.    }. 
2c100 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
2c110 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ct the WhereLoop
2c120 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20   objects */.#if 
2c130 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
2c140 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66  CE_ENABLED).  if
2c150 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2c160 61 63 65 20 26 20 30 78 66 66 66 66 20 29 7b 0a  ace & 0xffff ){.
2c170 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c180 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69  Printf("*** Opti
2c190 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 20  mizer Start *** 
2c1a0 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78 25  (wctrlFlags: 0x%
2c1b0 78 22 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  x",wctrlFlags);.
2c1c0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
2c1d0 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
2c1e0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 73 71  IMIT ){.      sq
2c1f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2c200 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20  (", limit: %d", 
2c210 69 41 75 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a  iAuxArg);.    }.
2c220 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c230 50 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20  Printf(")\n");. 
2c240 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2c250 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
2c260 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79  00 ){ /* Display
2c270 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
2c280 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2c290 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
2c2a0 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 57  reClausePrint(sW
2c2b0 4c 42 2e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  LB.pWC);.  }.#en
2c2c0 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c  dif..  if( nTabL
2c2d0 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53  ist!=1 || whereS
2c2e0 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d  hortCut(&sWLB)==
2c2f0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68  0 ){.    rc = wh
2c300 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73  ereLoopAddAll(&s
2c310 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63  WLB);.    if( rc
2c320 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c330 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64  inError;.  .#ifd
2c340 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2c350 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
2c360 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2c370 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79  ){    /* Display
2c380 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
2c390 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2c3a0 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
2c3b0 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
2c3c0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
2c3d0 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c  onst char zLabel
2c3e0 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  [] = "0123456789
2c3f0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
2c400 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20  qrstuvwyxz".    
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c430 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
2c440 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2c450 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
2c460 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
2c470 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
2c480 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
2c490 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
2c4a0 3d 20 7a 4c 61 62 65 6c 5b 69 25 28 73 69 7a 65  = zLabel[i%(size
2c4b0 6f 66 28 7a 4c 61 62 65 6c 29 2d 31 29 5d 3b 0a  of(zLabel)-1)];.
2c4c0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
2c4d0 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70  pPrint(p, sWLB.p
2c4e0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WC);.      }.   
2c4f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
2c500 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
2c510 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
2c520 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c530 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2c540 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2c550 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
2c560 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
2c570 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
2c580 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
2c590 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
2c5a0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2c5b0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2c5c0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2c5d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2c5e0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2c5f0 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
2c600 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
2c610 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
2c620 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
2c630 4d 61 73 6b 20 3d 20 41 4c 4c 42 49 54 53 3b 0a  Mask = ALLBITS;.
2c640 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
2c650 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28  ->nErr || NEVER(
2c660 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c670 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
2c680 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2c690 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
2c6a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2c6b0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2c6c0 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  race ){.    sqli
2c6d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2c6e0 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
2c6f0 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
2c700 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
2c710 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
2c720 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
2c730 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2c740 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c   ORDERBY=%d,0x%l
2c750 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  lx", pWInfo->nOB
2c760 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  Sat, pWInfo->rev
2c770 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
2c780 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
2c790 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
2c7a0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
2c7b0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
2c7c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c7d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
2c7e0 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
2c7f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2c800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c810 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
2c820 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
2c830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2c840 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
2c850 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
2c860 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2c870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
2c880 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
2c890 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
2c8a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2c8b0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
2c8c0 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
2c8d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2c8e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c8f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c900 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
2c910 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2c920 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
2c930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
2c940 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
2c950 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
2c960 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
2c970 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c980 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d  /* Attempt to om
2c990 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74  it tables from t
2c9a0 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20  he join that do 
2c9b0 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72  not affect the r
2c9c0 65 73 75 6c 74 2e 0a 20 20 2a 2a 20 46 6f 72 20  esult..  ** For 
2c9d0 61 20 74 61 62 6c 65 20 74 6f 20 6e 6f 74 20 61  a table to not a
2c9e0 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
2c9f0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
2ca00 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 20 20  must be true:.  
2ca10 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 54 68 65  **.  **   1) The
2ca20 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
2ca30 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  be an aggregate.
2ca40 0a 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 74  .  **   2) The t
2ca50 61 62 6c 65 20 6d 75 73 74 20 62 65 20 74 68 65  able must be the
2ca60 20 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20 4a   RHS of a LEFT J
2ca70 4f 49 4e 2e 0a 20 20 2a 2a 20 20 20 33 29 20 45  OIN..  **   3) E
2ca80 69 74 68 65 72 20 74 68 65 20 71 75 65 72 79 20  ither the query 
2ca90 6d 75 73 74 20 62 65 20 44 49 53 54 49 4e 43 54  must be DISTINCT
2caa0 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 4f 4e  , or else the ON
2cab0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2cac0 0a 20 20 2a 2a 20 20 20 20 20 20 6d 75 73 74 20  .  **      must 
2cad0 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6e 73 74 72  contain a constr
2cae0 61 69 6e 74 20 74 68 61 74 20 6c 69 6d 69 74 73  aint that limits
2caf0 20 74 68 65 20 73 63 61 6e 20 6f 66 20 74 68 65   the scan of the
2cb00 20 74 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20   table to .  ** 
2cb10 20 20 20 20 20 61 74 20 6d 6f 73 74 20 61 20 73       at most a s
2cb20 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2a 20  ingle row..  ** 
2cb30 20 20 34 29 20 54 68 65 20 74 61 62 6c 65 20 6d    4) The table m
2cb40 75 73 74 20 6e 6f 74 20 62 65 20 72 65 66 65 72  ust not be refer
2cb50 65 6e 63 65 64 20 62 79 20 61 6e 79 20 70 61 72  enced by any par
2cb60 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  t of the query a
2cb70 70 61 72 74 0a 20 20 2a 2a 20 20 20 20 20 20 66  part.  **      f
2cb80 72 6f 6d 20 69 74 73 20 6f 77 6e 20 55 53 49 4e  rom its own USIN
2cb90 47 20 6f 72 20 4f 4e 20 63 6c 61 75 73 65 2e 0a  G or ON clause..
2cba0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78    **.  ** For ex
2cbb0 61 6d 70 6c 65 2c 20 67 69 76 65 6e 3a 0a 20 20  ample, given:.  
2cbc0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
2cbd0 54 45 20 54 41 42 4c 45 20 74 31 28 69 70 6b 20  TE TABLE t1(ipk 
2cbe0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2cbf0 4b 45 59 2c 20 76 31 29 3b 0a 20 20 2a 2a 20 20  KEY, v1);.  **  
2cc00 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2cc10 74 32 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50  t2(ipk INTEGER P
2cc20 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 32 29 3b  RIMARY KEY, v2);
2cc30 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
2cc40 20 54 41 42 4c 45 20 74 33 28 69 70 6b 20 49 4e   TABLE t3(ipk IN
2cc50 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2cc60 59 2c 20 76 33 29 3b 0a 20 20 2a 2a 0a 20 20 2a  Y, v3);.  **.  *
2cc70 2a 20 74 68 65 6e 20 74 61 62 6c 65 20 74 32 20  * then table t2 
2cc80 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 66  can be omitted f
2cc90 72 6f 6d 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rom the followin
2cca0 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g:.  **.  **    
2ccb0 20 53 45 4c 45 43 54 20 76 31 2c 20 76 33 20 46   SELECT v1, v3 F
2ccc0 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20 20  ROM t1 .  **    
2ccd0 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20     LEFT JOIN t2 
2cce0 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 32  USING (t1.ipk=t2
2ccf0 2e 69 70 6b 29 0a 20 20 2a 2a 20 20 20 20 20 20  .ipk).  **      
2cd00 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55 53   LEFT JOIN t3 US
2cd10 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69  ING (t1.ipk=t3.i
2cd20 70 6b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6f 72  pk).  **.  ** or
2cd30 20 66 72 6f 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   from:.  **.  **
2cd40 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
2cd50 49 4e 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d  INCT v1, v3 FROM
2cd60 20 74 31 20 0a 20 20 2a 2a 20 20 20 20 20 20 20   t1 .  **       
2cd70 4c 45 46 54 20 4a 4f 49 4e 20 74 32 0a 20 20 2a  LEFT JOIN t2.  *
2cd80 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49  *       LEFT JOI
2cd90 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31 2e 69  N t3 USING (t1.i
2cda0 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2f 0a  pk=t3.ipk).  */.
2cdb0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2cdc0 69 74 6d 61 73 6b 29 30 3b 0a 20 20 69 66 28 20  itmask)0;.  if( 
2cdd0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
2cde0 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53  2.   && pResultS
2cdf0 65 74 21 3d 30 20 20 20 20 20 20 20 20 20 20 20  et!=0           
2ce00 20 20 20 20 2f 2a 20 67 75 61 72 61 6e 74 65 65      /* guarantee
2ce10 73 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  s condition (1) 
2ce20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 26 26 20 4f  above */.   && O
2ce30 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2ce40 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d  ed(db, SQLITE_Om
2ce50 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b  itNoopJoin).  ){
2ce60 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2ce70 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
2ce80 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
2ce90 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
2cea0 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74  kSet, pResultSet
2ceb0 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e  );.    if( sWLB.
2cec0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2ced0 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c    tabUsed |= sql
2cee0 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
2cef0 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
2cf00 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
2cf10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2cf20 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2cf30 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20  1; i>=1; i--){. 
2cf40 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2cf50 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
2cf60 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2cf70 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2cf80 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
2cf90 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 57 4c 6f 6f  Info->a[i].pWLoo
2cfa0 70 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d  p;.      pItem =
2cfb0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
2cfc0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
2cfd0 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  b];.      if( (p
2cfe0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
2cff0 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
2d000 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d010 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2d020 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2d030 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
2d040 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
2d050 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2d060 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
2d070 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
2d080 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2d090 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
2d0a0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2d0b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2d0c0 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57  .      pEnd = sW
2d0d0 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42  LB.pWC->a + sWLB
2d0e0 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  .pWC->nTerm;.   
2d0f0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c     for(pTerm=sWL
2d100 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  B.pWC->a; pTerm<
2d110 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  pEnd; pTerm++){.
2d120 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2d130 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
2d140 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2d150 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2d160 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
2d170 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
2d180 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2d190 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
2d1a0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 69 52 69  Term->pExpr->iRi
2d1b0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 49  ghtJoinTable!=pI
2d1c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20  tem->iCursor.   
2d1d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d1e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d1f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d200 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2d210 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20   if( pTerm<pEnd 
2d220 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d230 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
2d240 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
2d250 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
2d260 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
2d270 3b 0a 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79  ;.      notReady
2d280 20 26 3d 20 7e 70 4c 6f 6f 70 2d 3e 6d 61 73 6b   &= ~pLoop->mask
2d290 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
2d2a0 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e  pTerm=sWLB.pWC->
2d2b0 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70  a; pTerm<pEnd; p
2d2c0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2d2d0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
2d2e0 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
2d2f0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a  maskSelf)!=0 ){.
2d300 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
2d310 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
2d320 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 20 20  _CODED;.        
2d330 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2d340 69 66 28 20 69 21 3d 70 57 49 6e 66 6f 2d 3e 6e  if( i!=pWInfo->n
2d350 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20  Level-1 ){.     
2d360 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
2d370 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
2d380 2d 69 29 20 2a 20 73 69 7a 65 6f 66 28 57 68 65  -i) * sizeof(Whe
2d390 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  reLevel);.      
2d3a0 20 20 6d 65 6d 6d 6f 76 65 28 26 70 57 49 6e 66    memmove(&pWInf
2d3b0 6f 2d 3e 61 5b 69 5d 2c 20 26 70 57 49 6e 66 6f  o->a[i], &pWInfo
2d3c0 2d 3e 61 5b 69 2b 31 5d 2c 20 6e 42 79 74 65 29  ->a[i+1], nByte)
2d3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d3e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
2d3f0 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
2d400 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
2d410 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
2d420 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
2d430 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
2d440 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
2d450 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2d460 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
2d470 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
2d480 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2d490 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2d4a0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2d4b0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2d4c0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2d4d0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2d4e0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2d4f0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2d500 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6f 6e  ..  **.  ** A on
2d510 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  e-pass approach 
2d520 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 74  can be used if t
2d530 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65  he caller has re
2d540 71 75 65 73 74 65 64 20 6f 6e 65 0a 20 20 2a 2a  quested one.  **
2d550 20 61 6e 64 20 65 69 74 68 65 72 20 28 61 29 20   and either (a) 
2d560 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
2d570 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 20  at most one row 
2d580 6f 72 20 28 62 29 20 65 61 63 68 0a 20 20 2a 2a  or (b) each.  **
2d590 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2d5a0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
2d5b0 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 63 61  .  **   * the ca
2d5c0 6c 6c 65 72 20 68 61 73 20 69 6e 64 69 63 61 74  ller has indicat
2d5d0 65 64 20 74 68 61 74 20 61 20 6f 6e 65 2d 70 61  ed that a one-pa
2d5e0 73 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e 20  ss approach can 
2d5f0 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 20 20 20  be used.  **    
2d600 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 72   with multiple r
2d610 6f 77 73 20 28 62 79 20 73 65 74 74 69 6e 67 20  ows (by setting 
2d620 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2d630 4c 54 49 52 4f 57 29 2c 20 61 6e 64 0a 20 20 2a  LTIROW), and.  *
2d640 2a 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20  *   * the table 
2d650 69 73 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  is not a virtual
2d660 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a   table, and.  **
2d670 20 20 20 2a 20 65 69 74 68 65 72 20 74 68 65 20     * either the 
2d680 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  scan does not us
2d690 65 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  e the OR optimiz
2d6a0 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 63 61 6c  ation or the cal
2d6b0 6c 65 72 0a 20 20 2a 2a 20 20 20 20 20 69 73 20  ler.  **     is 
2d6c0 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  a DELETE operati
2d6d0 6f 6e 20 28 57 48 45 52 45 5f 44 55 50 4c 49 43  on (WHERE_DUPLIC
2d6e0 41 54 45 53 5f 4f 4b 20 69 73 20 6f 6e 6c 79 20  ATES_OK is only 
2d6f0 73 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20 20  specified.  **  
2d700 20 20 20 66 6f 72 20 44 45 4c 45 54 45 29 2e 0a     for DELETE)..
2d710 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
2d720 73 74 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  st qualification
2d730 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 20 55   is because an U
2d740 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
2d750 75 73 65 73 0a 20 20 2a 2a 20 57 68 65 72 65 49  uses.  ** WhereI
2d760 6e 66 6f 2e 61 69 43 75 72 4f 6e 65 50 61 73 73  nfo.aiCurOnePass
2d770 5b 31 5d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  [1] to determine
2d780 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2d790 69 74 20 72 65 61 6c 6c 79 20 63 61 6e 0a 20 20  it really can.  
2d7a0 2a 2a 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  ** use a one-pas
2d7b0 73 20 61 70 70 72 6f 61 63 68 2c 20 61 6e 64 20  s approach, and 
2d7c0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 65 74 20  this is not set 
2d7d0 61 63 63 75 72 61 74 65 6c 79 20 66 6f 72 20 73  accurately for s
2d7e0 63 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 75  cans.  ** that u
2d7f0 73 65 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  se the OR optimi
2d800 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  zation..  */.  a
2d810 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
2d820 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2d830 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2d840 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
2d850 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
2d860 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2d870 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2d880 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
2d890 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f  wsFlags = pWInfo
2d8a0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
2d8b0 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  sFlags;.    int 
2d8c0 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61  bOnerow = (wsFla
2d8d0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2d8e0 57 29 21 3d 30 3b 0a 20 20 20 20 61 73 73 65 72  W)!=0;.    asser
2d8f0 74 28 20 21 28 77 73 46 6c 61 67 73 20 26 20 57  t( !(wsFlags & W
2d900 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2d910 45 29 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  E) || IsVirtual(
2d920 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
2d930 54 61 62 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Tab) );.    if( 
2d940 62 4f 6e 65 72 6f 77 20 7c 7c 20 28 0a 20 20 20  bOnerow || (.   
2d950 20 20 20 20 20 30 21 3d 28 77 63 74 72 6c 46 6c       0!=(wctrlFl
2d960 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2d970 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 0a 20 20  ASS_MULTIROW).  
2d980 20 20 20 26 26 20 21 49 73 56 69 72 74 75 61 6c     && !IsVirtual
2d990 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
2d9a0 70 54 61 62 29 0a 20 20 20 20 20 26 26 20 28 30  pTab).     && (0
2d9b0 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  ==(wsFlags & WHE
2d9c0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20  RE_MULTI_OR) || 
2d9d0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2d9e0 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
2d9f0 4b 29 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  K)).    )){.    
2da00 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61    pWInfo->eOnePa
2da10 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f  ss = bOnerow ? O
2da20 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20  NEPASS_SINGLE : 
2da30 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20  ONEPASS_MULTI;. 
2da40 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
2da50 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
2da60 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61  .pTab) && (wsFla
2da70 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2da80 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NLY) ){.        
2da90 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2daa0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2dab0 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20  ULTIROW ){.     
2dac0 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20       bFordelete 
2dad0 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  = OPFLAG_FORDELE
2dae0 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TE;.        }.  
2daf0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
2db00 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
2db10 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  gs = (wsFlags & 
2db20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  ~WHERE_IDX_ONLY)
2db30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2db40 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2db50 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2db60 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
2db70 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
2db80 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
2db90 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
2dba0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2dbb0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2dbc0 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
2dbd0 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
2dbe0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2dbf0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
2dc00 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2dc10 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
2dc20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
2dc30 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2dc40 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
2dc50 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
2dc60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
2dc70 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
2dc80 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2dc90 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2dca0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
2dcb0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2dcc0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2dcd0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
2dce0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2dcf0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2dd00 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
2dd10 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2dd20 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2dd30 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
2dd40 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2dd50 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
2dd60 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
2dd70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2dd80 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2dd90 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2dda0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2ddb0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
2ddc0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2ddd0 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
2dde0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2ddf0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
2de00 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
2de10 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
2de20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
2de30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2de40 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
2de50 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
2de60 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
2de70 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
2de80 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
2de90 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
2dea0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2deb0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2dec0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2ded0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
2dee0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2def0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2df00 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20  BCLAUSE)==0 ){. 
2df10 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
2df20 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
2df30 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2df40 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2df50 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  FF ){.        op
2df60 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
2df70 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
2df80 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
2df90 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2dfa0 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  rsor;.      };. 
2dfb0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
2dfc0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2dfd0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
2dfe0 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
2dff0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e000 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2e010 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  ==pLevel->iTabCu
2e020 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r );.      testc
2e030 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
2e040 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2e050 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2e060 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2e070 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
2e080 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2e090 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
2e0a0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
2e0b0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2e0c0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2e0d0 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e  SS_OFF && pTab->
2e0e0 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52  nCol<BMS && HasR
2e0f0 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
2e100 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
2e110 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
2e120 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
2e130 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
2e140 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
2e150 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
2e160 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2e170 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54  eP4(v, -1, SQLIT
2e180 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
2e190 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
2e1a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
2e1b0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
2e1c0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2e1d0 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
2e1e0 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28  _HINTS.      if(
2e1f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2e200 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
2e210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e220 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2e230 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65  AG_SEEKEQ|bForde
2e240 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lete);.      }el
2e250 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2e260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e270 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2e280 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20   bFordelete);.  
2e290 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2e2a0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2e2b0 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
2e2c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e2d0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
2e2e0 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49  lumnsUsed, pTabI
2e2f0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c  tem->iCursor, 0,
2e300 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e320 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62  (const u8*)&pTab
2e330 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50  Item->colUsed, P
2e340 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
2e350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e360 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2e370 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2e380 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2e390 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
2e3a0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2e3b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e3c0 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
2e3d0 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
2e3e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2e3f0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
2e400 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
2e410 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
2e420 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
2e430 20 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61   iAuxArg is alwa
2e440 79 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  ys set to a posi
2e450 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e  tive value if ON
2e460 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c  EPASS is possibl
2e470 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2e480 74 28 20 69 41 75 78 41 72 67 21 3d 30 20 7c 7c  t( iAuxArg!=0 ||
2e490 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2e4a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2e4b0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2e4c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
2e4d0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
2e4e0 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
2e4f0 65 78 28 70 49 78 29 0a 20 20 20 20 20 20 20 26  ex(pIx).       &
2e500 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2e510 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2e520 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a  SE)!=0.      ){.
2e530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2e540 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  is one term of a
2e550 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f  n OR-optimizatio
2e560 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d  n using the PRIM
2e570 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20  ARY KEY of a.   
2e580 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20       ** WITHOUT 
2e590 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f  ROWID table.  No
2e5a0 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61   need for a sepa
2e5b0 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rate index */.  
2e5c0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2e5d0 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
2e5e0 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  r;.        op = 
2e5f0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
2e600 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2e610 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
2e620 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65   ){.        Inde
2e630 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d  x *pJ = pTabItem
2e640 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
2e650 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2e660 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20  r = iAuxArg;.   
2e670 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74       assert( wct
2e680 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2e690 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
2e6a0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
2e6b0 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20  ( ALWAYS(pJ) && 
2e6c0 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20  pJ!=pIx ){.     
2e6d0 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b       iIndexCur++
2e6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d  ;.          pJ =
2e6f0 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pJ->pNext;.    
2e700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70      }.        op
2e710 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
2e720 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
2e730 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
2e740 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
2e750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 41      }else if( iA
2e760 75 78 41 72 67 20 26 26 20 28 77 63 74 72 6c 46  uxArg && (wctrlF
2e770 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
2e780 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20 29 7b  SUBCLAUSE)!=0 ){
2e790 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2e7a0 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20  ur = iAuxArg;.  
2e7b0 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65        op = OP_Re
2e7c0 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d  openIdx;.      }
2e7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49  else{.        iI
2e7e0 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65  ndexCur = pParse
2e7f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2e800 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
2e810 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78  iIdxCur = iIndex
2e820 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
2e830 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
2e840 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
2e850 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e860 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
2e870 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a        if( op ){.
2e880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e890 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
2e8a0 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
2e8b0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
2e8c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e8d0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
2e8e0 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
2e8f0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2e900 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
2e910 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20  ONSTRAINT)!=0.  
2e920 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2e930 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
2e940 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
2e950 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29  WHERE_SKIPSCAN))
2e960 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2e970 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2e980 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
2e990 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20  Y_MIN)==0.      
2e9a0 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
2e9b0 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45 5f 44  istinct!=WHERE_D
2e9c0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a  ISTINCT_ORDERED.
2e9d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2e9e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e9f0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2ea00 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48  AG_SEEKEQ); /* H
2ea10 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f  int to COMDB2 */
2ea20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ea30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ea40 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
2ea50 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ame));.#ifdef SQ
2ea60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2ea70 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
2ea80 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2ea90 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30   u64 colUsed = 0
2eaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2eab0 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  ii, jj;.        
2eac0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2ead0 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b  Ix->nColumn; ii+
2eae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2eaf0 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75  jj = pIx->aiColu
2eb00 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  mn[ii];.        
2eb10 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63      if( jj<0 ) c
2eb20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2eb30 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29       if( jj>63 )
2eb40 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20   jj = 63;.      
2eb50 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49        if( (pTabI
2eb60 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  tem->colUsed & M
2eb70 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29  ASKBIT(jj))==0 )
2eb80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2eb90 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
2eba0 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c  = ((u64)1)<<(ii<
2ebb0 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20  63 ? ii : 63);. 
2ebc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ebd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ebe0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
2ebf0 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49  _ColumnsUsed, iI
2ec00 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20  ndexCur, 0, 0,. 
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2ec30 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34  u8*)&colUsed, P4
2ec40 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20  _INT64);.       
2ec50 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
2ec60 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2ec70 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20  N_USED_MASK */. 
2ec80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ec90 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71   if( iDb>=0 ) sq
2eca0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2ecb0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2ecc0 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
2ecd0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
2ece0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2ecf0 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
2ed00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2ed10 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2ed20 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
2ed30 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
2ed40 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
2ed50 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
2ed60 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
2ed70 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
2ed80 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
2ed90 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
2eda0 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
2edb0 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 66  rogram..  */.  f
2edc0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
2edd0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
2ede0 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
2edf0 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  ;.    int wsFlag
2ee00 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  s;.    pLevel = 
2ee10 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
2ee20 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c      wsFlags = pL
2ee30 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
2ee40 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53  Flags;.#ifndef S
2ee50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2ee60 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
2ee70 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
2ee80 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2ee90 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
2eea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2eeb0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
2eec0 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
2eed0 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
2eee0 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
2eef0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2ef00 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
2ef10 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
2ef20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ef30 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2ef40 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
2ef50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64   }.#endif.    ad
2ef60 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69  drExplain = sqli
2ef70 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f  te3WhereExplainO
2ef80 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
2ef90 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2efa0 2c 20 70 4c 65 76 65 6c 2c 20 77 63 74 72 6c 46  , pLevel, wctrlF
2efb0 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20  lags.    );.    
2efc0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2efd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2efe0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2eff0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c    notReady = sql
2f000 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65  ite3WhereCodeOne
2f010 4c 6f 6f 70 53 74 61 72 74 28 70 50 61 72 73 65  LoopStart(pParse
2f020 2c 76 2c 70 57 49 6e 66 6f 2c 69 69 2c 70 4c 65  ,v,pWInfo,ii,pLe
2f030 76 65 6c 2c 6e 6f 74 52 65 61 64 79 29 3b 0a 20  vel,notReady);. 
2f040 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2f050 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2f060 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28  ddrCont;.    if(
2f070 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f   (wsFlags&WHERE_
2f080 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20  MULTI_OR)==0 && 
2f090 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
2f0a0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2f0b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2f0c0 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
2f0d0 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73  tatus(v, pTabLis
2f0e0 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45  t, pLevel, addrE
2f0f0 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  xplain);.    }. 
2f100 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
2f110 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
2f120 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
2f130 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2f140 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
2f150 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
2f160 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2f170 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
2f180 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
2f190 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
2f1a0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2f1b0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2f1c0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
2f1d0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2f1e0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
2f1f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
2f200 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 57 68  art of sqlite3Wh
2f210 65 72 65 45 6e 64 28 29 20 77 69 6c 6c 20 72 65  ereEnd() will re
2f220 77 72 69 74 65 20 6f 70 63 6f 64 65 73 20 74 6f  write opcodes to
2f230 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 0a 2a   reference the.*
2f240 2a 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  * index rather t
2f250 68 61 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62  han the main tab
2f260 6c 65 2e 20 20 49 6e 20 53 51 4c 49 54 45 5f 44  le.  In SQLITE_D
2f270 45 42 55 47 20 6d 6f 64 65 2c 20 77 65 20 77 61  EBUG mode, we wa
2f280 6e 74 0a 2a 2a 20 74 6f 20 74 72 61 63 65 20 74  nt.** to trace t
2f290 68 6f 73 65 20 63 68 61 6e 67 65 73 20 69 66 20  hose changes if 
2f2a0 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
2f2b0 70 74 72 61 63 65 3d 6f 6e 2e 20 20 54 68 69 73  ptrace=on.  This
2f2c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
2f2d0 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65   that..*/.#ifnde
2f2e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
2f2f0 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65   define OpcodeRe
2f300 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50  writeTrace(D,K,P
2f310 29 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65  ) /* no-op */.#e
2f320 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4f 70 63  lse.# define Opc
2f330 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
2f340 44 2c 4b 2c 50 29 20 73 71 6c 69 74 65 33 57 68  D,K,P) sqlite3Wh
2f350 65 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ereOpcodeRewrite
2f360 54 72 61 63 65 28 44 2c 4b 2c 50 29 0a 20 20 73  Trace(D,K,P).  s
2f370 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2f380 65 33 57 68 65 72 65 4f 70 63 6f 64 65 52 65 77  e3WhereOpcodeRew
2f390 72 69 74 65 54 72 61 63 65 28 0a 20 20 20 20 73  riteTrace(.    s
2f3a0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20 20  qlite3 *db,.    
2f3b0 69 6e 74 20 70 63 2c 0a 20 20 20 20 56 64 62 65  int pc,.    Vdbe
2f3c0 4f 70 20 2a 70 4f 70 0a 20 20 29 7b 0a 20 20 20  Op *pOp.  ){.   
2f3d0 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
2f3e0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
2f3f0 6f 70 54 72 61 63 65 29 3d 3d 30 20 29 20 72 65  opTrace)==0 ) re
2f400 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
2f410 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
2f420 70 63 2c 20 70 4f 70 29 3b 0a 20 20 7d 0a 23 65  pc, pOp);.  }.#e
2f430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
2f440 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
2f450 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
2f460 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
2f470 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
2f480 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
2f490 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2f4a0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2f4b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
2f4c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2f4d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2f4e0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2f4f0 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
2f500 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2f510 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
2f520 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57  vel *pLevel;.  W
2f530 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2f540 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2f550 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2f560 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
2f570 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2f580 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
2f590 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
2f5a0 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
2f5b0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2f5c0 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
2f5d0 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 66 6f  RE-core"));.  fo
2f5e0 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
2f5f0 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
2f600 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
2f610 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2f620 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2f630 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2f640 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
2f650 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
2f660 6f 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  oop ){.#ifndef S
2f670 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b  QLITE_DISABLE_SK
2f680 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54  IPAHEAD_DISTINCT
2f690 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2f6a0 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 49  eek = 0;.      I
2f6b0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
2f6c0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69    int n;.      i
2f6d0 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  f( pWInfo->eDist
2f6e0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
2f6f0 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20  INCT_ORDERED.   
2f700 20 20 20 20 26 26 20 69 3d 3d 70 57 49 6e 66 6f      && i==pWInfo
2f710 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a 20 54  ->nLevel-1  /* T
2f720 69 63 6b 65 74 20 5b 65 66 39 33 31 38 37 35 37  icket [ef9318757
2f730 62 31 35 32 65 33 5d 20 32 30 31 37 2d 31 30 2d  b152e3] 2017-10-
2f740 32 31 20 2a 2f 0a 20 20 20 20 20 20 20 26 26 20  21 */.       && 
2f750 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2f760 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2f770 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  !=0.       && (p
2f780 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
2f790 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61  tree.pIndex)->ha
2f7a0 73 53 74 61 74 31 0a 20 20 20 20 20 20 20 26 26  sStat1.       &&
2f7b0 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   (n = pLoop->u.b
2f7c0 74 72 65 65 2e 6e 44 69 73 74 69 6e 63 74 43 6f  tree.nDistinctCo
2f7d0 6c 29 3e 30 0a 20 20 20 20 20 20 20 26 26 20 70  l)>0.       && p
2f7e0 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
2f7f0 5b 6e 5d 3e 3d 33 36 0a 20 20 20 20 20 20 29 7b  [n]>=36.      ){
2f800 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
2f810 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2f820 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c  ;.        int j,
2f830 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   op;.        for
2f840 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  (j=0; j<n; j++){
2f850 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f860 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f870 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65  OP_Column, pLeve
2f880 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6a 2c 20 72  l->iIdxCur, j, r
2f890 31 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  1+j);.        }.
2f8a0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2f8b0 6e 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20  nMem += n+1;.   
2f8c0 20 20 20 20 20 6f 70 20 3d 20 70 4c 65 76 65 6c       op = pLevel
2f8d0 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 20 3f 20  ->op==OP_Prev ? 
2f8e0 4f 50 5f 53 65 65 6b 4c 54 20 3a 20 4f 50 5f 53  OP_SeekLT : OP_S
2f8f0 65 65 6b 47 54 3b 0a 20 20 20 20 20 20 20 20 61  eekGT;.        a
2f900 64 64 72 53 65 65 6b 20 3d 20 73 71 6c 69 74 65  ddrSeek = sqlite
2f910 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2f920 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  , op, pLevel->iI
2f930 64 78 43 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29  dxCur, 0, r1, n)
2f940 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2f950 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2f960 4f 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20  OP_SeekLT);.    
2f970 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2f980 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
2f990 6b 47 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71  kGT);.        sq
2f9a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f9b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70  v, OP_Goto, 1, p
2f9c0 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
2f9d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2f9e0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49  LITE_DISABLE_SKI
2f9f0 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 20  PAHEAD_DISTINCT 
2fa00 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  */.      /* The 
2fa10 63 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41 64 76  common case: Adv
2fa20 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
2fa30 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 73 71   row */.      sq
2fa40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2fa50 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2fa60 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
2fa70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fa80 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op3(v, pLevel->o
2fa90 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
2faa0 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65  Level->p2, pLeve
2fab0 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71  l->p3);.      sq
2fac0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2fad0 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
2fae0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2faf0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2fb00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2fb10 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2fb20 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62  Next);.      Vdb
2fb30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2fb40 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72  Level->op==OP_Pr
2fb50 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ev);.      VdbeC
2fb60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
2fb70 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78  vel->op==OP_VNex
2fb80 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
2fb90 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41  TE_DISABLE_SKIPA
2fba0 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20  HEAD_DISTINCT.  
2fbb0 20 20 20 20 69 66 28 20 61 64 64 72 53 65 65 6b      if( addrSeek
2fbc0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
2fbd0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 53 65  mpHere(v, addrSe
2fbe0 65 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ek);.#endif.    
2fbf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2fc00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2fc10 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2fc20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
2fc30 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2fc40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fc50 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
2fc60 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
2fc70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
2fc80 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
2fc90 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
2fca0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2fcb0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2fcc0 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
2fcd0 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
2fce0 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
2fcf0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
2fd00 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
2fd10 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
2fd20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2fd30 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
2fd40 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
2fd50 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 65 45       if( pIn->eE
2fd60 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f  ndLoopOp!=OP_Noo
2fd70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
2fd80 66 28 20 70 49 6e 2d 3e 6e 50 72 65 66 69 78 20  f( pIn->nPrefix 
2fd90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2fda0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 77 73  ssert( pLoop->ws
2fdb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2fdc0 5f 45 41 52 4c 59 4f 55 54 20 29 3b 0a 20 20 20  _EARLYOUT );.   
2fdd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fde0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
2fdf0 20 4f 50 5f 49 66 4e 6f 48 6f 70 65 2c 20 70 4c   OP_IfNoHope, pL
2fe00 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 0a 20  evel->iIdxCur,. 
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2fe30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2fe40 64 64 72 28 76 29 2b 32 2c 0a 20 20 20 20 20 20  ddr(v)+2,.      
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 42 61          pIn->iBa
2fe70 73 65 2c 20 70 49 6e 2d 3e 6e 50 72 65 66 69 78  se, pIn->nPrefix
2fe80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
2fe90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2fea0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2feb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fec0 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
2fed0 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
2fee0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
2fef0 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
2ff00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2ff10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2ff20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2ff30 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2ff40 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20  OP_Prev);.      
2ff50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2ff60 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  If(v, pIn->eEndL
2ff70 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  oopOp==OP_Next);
2ff80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ff90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2ffa0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
2ffb0 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
2ffc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2ffd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2ffe0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2fff0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
30000 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
30010 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Skip ){.      sq
30020 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
30030 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
30040 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
30050 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
30060 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22  skip-scan on %s"
30070 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
30080 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29  .pIndex->zName))
30090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
300a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
300b0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
300c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
300d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
300e0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d  Level->addrSkip-
300f0 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  2);.    }.#ifnde
30100 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f  f SQLITE_LIKE_DO
30110 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53  ESNT_MATCH_BLOBS
30120 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
30130 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a  >addrLikeRep ){.
30140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
30160 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74  crJumpZero, (int
30170 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52  )(pLevel->iLikeR
30180 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20  epCntr>>1),.    
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
301b0 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20  LikeRep);.      
301c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
301d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
301e0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
301f0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
30200 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d   int ws = pLoop-
30210 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
30220 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
30230 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
30240 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
30250 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f  eftJoin); VdbeCo
30260 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
30270 20 61 73 73 65 72 74 28 20 28 77 73 20 26 20 57   assert( (ws & W
30280 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
30290 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45 52 45  0 || (ws & WHERE
302a0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
302b0 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20        if( (ws & 
302c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
302d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
302e0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 54  sert( pLevel->iT
302f0 61 62 43 75 72 3d 3d 70 54 61 62 4c 69 73 74 2d  abCur==pTabList-
30300 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
30310 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ].iCursor );.   
30320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30330 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
30340 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  lRow, pLevel->iT
30350 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  abCur);.      }.
30360 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20        if( (ws & 
30370 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 0a  WHERE_INDEXED) .
30380 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73 20 26         || ((ws &
30390 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
303a0 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43   && pLevel->u.pC
303b0 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20 29 7b  ovidx) .      ){
303c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
303d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
303e0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
303f0 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
30400 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
30410 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
30420 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
30430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30440 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
30450 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
30460 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
30470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
30490 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  to(v, pLevel->ad
304a0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
304b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
304c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
304d0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ddr);.    }.    
304e0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
304f0 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
30500 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c  -loop%d: %s", i,
30510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30520 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54        pWInfo->pT
30530 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
30540 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a  ->iFrom].pTab->z
30550 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Name));.  }..  /
30560 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
30570 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
30580 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
30590 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
305a0 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
305b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
305c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
305d0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
305e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ;..  assert( pWI
305f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61  nfo->nLevel<=pTa
30600 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
30610 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
30620 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57  =pWInfo->a; i<pW
30630 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
30640 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
30650 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20    int k, last;. 
30660 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
30670 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
30680 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
30690 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
306a0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
306b0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
306c0 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
306d0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
306e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
306f0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
30700 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
30710 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
30720 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74  /* For a co-rout
30730 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20  ine, change all 
30740 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65  OP_Column refere
30750 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nces to the tabl
30760 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
30770 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20  co-routine into 
30780 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c  OP_Copy of resul
30790 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  t contained in a
307a0 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a   register..    *
307b0 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d  * OP_Rowid becom
307c0 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20  es OP_Null..    
307d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49  */.    if( pTabI
307e0 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
307f0 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65  tine ){.      te
30800 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e  stcase( pParse->
30810 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
30820 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c   );.      transl
30830 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
30840 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  pParse, pLevel->
30850 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c  addrBody, pLevel
30860 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  ->iTabCur,.     
30870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30880 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d         pTabItem-
30890 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a  >regResult, 0);.
308a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
308b0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
308c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 41 52 4c  LITE_ENABLE_EARL
308d0 59 5f 43 55 52 53 4f 52 5f 43 4c 4f 53 45 0a 20  Y_CURSOR_CLOSE. 
308e0 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20     /* Close all 
308f0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
30900 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
30910 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
30920 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63  egin..    ** Exc
30930 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73  ept, do not clos
30940 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
30950 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62 79  ill be reused by
30960 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61   the OR optimiza
30970 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45  tion.    ** (WHE
30980 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
30990 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
309a0 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
309b0 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
309c0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
309d0 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
309e0 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
309f0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
30a00 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
30a10 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
30a20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
30a30 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
30a40 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
30a50 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
30a60 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  LAUSE)==0.    ){
30a70 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
30a80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
30a90 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
30aa0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
30ab0 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26  ASS_OFF && (ws &
30ac0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
30ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
30ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30af0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
30b00 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
30b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30b20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
30b30 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
30b40 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45     && (ws & (WHE
30b50 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54  RE_IPK|WHERE_AUT
30b60 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20  O_INDEX))==0 .  
30b70 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e       && pLevel->
30b80 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d  iIdxCur!=pWInfo-
30b90 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
30ba0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
30bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30bc0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
30bd0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
30be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30bf0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
30c00 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
30c10 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
30c20 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
30c30 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
30c40 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
30c50 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
30c60 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
30c70 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
30c80 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
30c90 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
30ca0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
30cb0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
30cc0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
30cd0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
30ce0 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
30cf0 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
30d00 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
30d10 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
30d20 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
30d30 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
30d40 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
30d50 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
30d60 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
30d70 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
30d80 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
30d90 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
30da0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
30db0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
30dc0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
30dd0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
30de0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
30df0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
30e00 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
30e10 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
30e20 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
30e30 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
30e40 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
30e50 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
30e60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
30e70 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
30e80 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
30e90 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
30ea0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
30eb0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
30ec0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
30ed0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
30ee0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
30ef0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
30f00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
30f10 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
30f20 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
30f30 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
30f40 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
30f50 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
30f60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
30f70 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
30f80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30f90 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
30fa0 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
30fb0 64 64 72 42 6f 64 79 3b 0a 23 69 66 64 65 66 20  ddrBody;.#ifdef 
30fc0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
30fd0 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
30fe0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
30ff0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
31000 20 20 20 20 70 72 69 6e 74 66 28 22 54 52 41 4e      printf("TRAN
31010 53 4c 41 54 45 20 6f 70 63 6f 64 65 73 20 69 6e  SLATE opcodes in
31020 20 72 61 6e 67 65 20 25 64 2e 2e 25 64 5c 6e 22   range %d..%d\n"
31030 2c 20 6b 2c 20 6c 61 73 74 2d 31 29 3b 0a 20 20  , k, last-1);.  
31040 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31050 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
31060 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
31070 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
31080 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
31090 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
310a0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
310b0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
310c0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
310d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
310e0 6f 6c 75 6d 6e 0a 23 69 66 64 65 66 20 53 51 4c  olumn.#ifdef SQL
310f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
31100 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
31110 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f      || pOp->opco
31120 64 65 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a 23 65  de==OP_Offset.#e
31130 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a  ndif.        ){.
31140 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
31150 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
31160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
31170 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20  x->pTable==pTab 
31180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31190 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
311a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
311b0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
311c0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
311d0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
311e0 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
311f0 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20  aiColumn[x];.   
31200 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31210 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
31220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78     }.          x
31230 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
31240 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29  OfIndex(pIdx, x)
31250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31260 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x>=0 ){.        
31270 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b      pOp->p2 = x;
31280 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
31290 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
312a0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
312b0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
312c0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
312d0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
312e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
312f0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
31300 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
31310 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a  LY)==0 || x>=0 .
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
31330 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
31340 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  s );.        }el
31350 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
31360 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
31370 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
31380 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
31390 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
313a0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
313b0 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
313c0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
313d0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
313e0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
313f0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
31400 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  e==OP_IfNullRow 
31410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
31420 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
31430 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
31440 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54    OpcodeRewriteT
31450 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f 70 29  race(db, k, pOp)
31460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31470 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
31480 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
31490 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
314a0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
314b0 61 63 65 20 29 20 70 72 69 6e 74 66 28 22 54 52  ace ) printf("TR
314c0 41 4e 53 4c 41 54 45 20 63 6f 6d 70 6c 65 74 65  ANSLATE complete
314d0 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  \n");.#endif.   
314e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
314f0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
31500 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
31510 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
31520 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
31530 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
31540 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
31550 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.