/ Hex Artifact Content
Login

Artifact 99c7b718ef846ac952016083aaf4e22ede2290beceaf4730a2df55c023251369:


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 62 49 6e  **.** If the bIn
4cd0: 63 72 52 6f 77 69 64 20 70 61 72 61 6d 65 74 65  crRowid paramete
4ce0: 72 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6e 79  r is 0, then any
4cf0: 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73 74 72 75   OP_Rowid instru
4d00: 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72  ctions on.** cur
4d10: 73 6f 72 20 69 54 61 62 43 75 72 20 61 72 65 20  sor iTabCur are 
4d20: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
4d30: 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66   OP_Null. Or, if
4d40: 20 62 49 6e 63 72 52 6f 77 69 64 20 69 73 20 6e   bIncrRowid is n
4d50: 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e  on-zero,.** then
4d60: 20 65 61 63 68 20 4f 50 5f 52 6f 77 69 64 20 69   each OP_Rowid i
4d70: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
4d80: 74 6f 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  to an instructio
4d90: 6e 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  n to increment t
4da0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
4db0: 65 64 20 69 6e 20 69 74 73 20 6f 75 74 70 75 74  ed in its output
4dc0: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 73 74   register..*/.st
4dd0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4de0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4df0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4e00: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4e10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
4e20: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4e30: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4e40: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
4e50: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
4e60: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
4e70: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4e80: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4e90: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4ea0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4eb0: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4ec0: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4ed0: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4ee0: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4ef0: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4f00: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4f10: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
4f20: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
4f30: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4f40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4f50: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  ;.  VdbeOp *pOp 
4f60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
4f70: 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20  Op(v, iStart);. 
4f80: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
4f90: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4fa0: 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50 61  dr(v);.  if( pPa
4fb0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4fc0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4fd0: 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c 69    for(; iStart<i
4fe0: 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70  End; iStart++, p
4ff0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  Op++){.    if( p
5000: 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72 20  Op->p1!=iTabCur 
5010: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5020: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
5030: 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
5040: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
5050: 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20  = OP_Copy;.     
5060: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e   pOp->p1 = pOp->
5070: 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b 0a  p2 + iRegister;.
5080: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
5090: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pOp->p3;.      p
50a0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
50b0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
50c0: 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
50d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ){.      if( bIn
50e0: 63 72 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  crRowid ){.     
50f0: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
5100: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
5110: 20 69 6e 20 74 68 65 20 50 32 20 6f 70 65 72 61   in the P2 opera
5120: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77  nd of the OP_Row
5130: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  id. */.        p
5140: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5150: 41 64 64 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20  AddImm;.        
5160: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70  pOp->p1 = pOp->p
5170: 32 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  2;.        pOp->
5180: 70 32 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  p2 = 1;.      }e
5190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
51a0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
51b0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
51c0: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >p1 = 0;.       
51d0: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
51e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
51f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
5200: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
5210: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
5220: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
5230: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
5240: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
5250: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
5260: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
5270: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
5280: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
5290: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
52a0: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
52b0: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
52c0: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
52d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
52e0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
52f0: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
5300: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
5310: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
5320: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
5330: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
5340: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5350: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
5360: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
5370: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5380: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
5390: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
53a0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
53b0: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
53c0: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
53d0: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
53e0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
53f0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
5400: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
5410: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
5420: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
5430: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
5440: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
5450: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
5460: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
5470: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
5480: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
5490: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
54a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
54b0: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
54c0: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
54d0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
54e0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
54f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5500: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
5510: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
5520: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
5530: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
5540: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
5550: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5560: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
5570: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
5580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5590: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
55a0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
55b0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
55c0: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
55d0: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
55e0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
55f0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
5600: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
5610: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
5620: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
5630: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
5640: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5650: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
5660: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
5670: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5680: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
5690: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
56a0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
56b0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
56c0: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
56d0: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
56e0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
56f0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
5700: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
5710: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
5720: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
5730: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
5740: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
5750: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
5760: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
5770: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
5780: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
5790: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
57a0: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
57b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
57c0: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
57d0: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
57e0: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
57f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
5800: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
5810: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
5820: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
5830: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
5840: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
5850: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
5860: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
5870: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5880: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5890: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
58a0: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
58b0: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
58c0: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
58d0: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
58e0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
58f0: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
5900: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
5910: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
5920: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
5930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5940: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
5950: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
5960: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
5970: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
5980: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
5990: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
59a0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
59b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
59c0: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d  (WO_EQ|WO_IS))==
59d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
59e0: 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  if( (pSrc->fg.jo
59f0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
5a00: 29 20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  ) .   && !ExprHa
5a10: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
5a20: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
5a30: 6f 69 6e 29 0a 20 20 20 26 26 20 28 70 54 65 72  oin).   && (pTer
5a40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
5a50: 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 2f  O_IS).  ){.    /
5a60: 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  * Cannot use an 
5a70: 49 53 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65  IS term from the
5a80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 73   WHERE clause as
5a90: 20 61 6e 20 69 6e 64 65 78 20 64 72 69 76 65 72   an index driver
5aa0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65 20   for.    ** the 
5ab0: 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  RHS of a LEFT JO
5ac0: 49 4e 2e 20 53 75 63 68 20 61 20 74 65 72 6d 20  IN. Such a term 
5ad0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
5ae0: 20 69 66 20 69 74 20 69 73 20 66 72 6f 6d 0a 20   if it is from. 
5af0: 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20 63 6c 61     ** the ON cla
5b00: 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74  use.  */.    ret
5b10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
5b20: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
5b30: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
5b40: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
5b50: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
5b60: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
5b70: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
5b80: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
5b90: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
5ba0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
5bb0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
5bc0: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
5bd0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
5be0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
5bf0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
5c00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
5c10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
5c20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
5c30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5c40: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
5c50: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5c60: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
5c70: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
5c80: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
5c90: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
5ca0: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
5cb0: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
5cc0: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
5cd0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
5ce0: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
5cf0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
5d00: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
5d10: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
5d20: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
5d30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5d50: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5d60: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
5d70: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5d80: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5d90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5da0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5db0: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5dc0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5dd0: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
5de0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
5df0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5e00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5e10: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
5e20: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
5e30: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
5e40: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
5e50: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
5e60: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
5e70: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5ea0: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5eb0: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5ec0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5ed0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
5ee0: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
5ef0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5f00: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
5f10: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
5f20: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
5f30: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
5f40: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5f50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
5f60: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
5f70: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5f80: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5fb0: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5fc0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5fd0: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5ff0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
6000: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
6010: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
6020: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
6030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6040: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
6050: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
6060: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
6070: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
6080: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
6090: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
60a0: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
60b0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
60c0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
60d0: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
60e0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
60f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
6100: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
6110: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6130: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
6140: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6160: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
6170: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
6180: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
6190: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
61a0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
61b0: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
61c0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
61d0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
61e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
61f0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
6200: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
6210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6220: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
6230: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
6240: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
6250: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
6260: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
6270: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
6280: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
6290: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
62a0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
62b0: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
62c0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
62d0: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
62e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
62f0: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
6300: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
6310: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
6320: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
6330: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
6340: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
6350: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
6360: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
6370: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
6380: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
6390: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
63a0: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
63b0: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
63c0: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
63d0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
63e0: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
63f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
6400: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
6410: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
6420: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
6430: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
6440: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6450: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
6460: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
6470: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
6480: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
6490: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
64a0: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
64b0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
64c0: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
64d0: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
64e0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
64f0: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
6500: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
6510: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6520: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6530: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
6540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
6550: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
6560: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
6570: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
6580: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
6590: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
65a0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
65b0: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
65c0: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
65d0: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
65e0: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
65f0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
6600: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
6610: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
6620: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
6630: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
6640: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
6650: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
6660: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
6670: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
6680: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6690: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
66a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
66b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
66c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
66d0: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
66e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
66f0: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
6700: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6710: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
6720: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
6730: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
6740: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
6750: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
6780: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
6790: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
67a0: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
67b0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
67c0: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
67d0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
67e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
67f0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6800: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
6810: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
6820: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
6830: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
6840: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
6850: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
6860: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  rse, pPartial,. 
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6890: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
68a0: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
68b0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
68c0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
68d0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
68e0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
68f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6900: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6910: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6920: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6930: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6940: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6950: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6960: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6970: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
6980: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6990: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
69a0: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
69b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
69c0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
69d0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
69e0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
69f0: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
6a00: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6a10: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6a20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
6a30: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
6a40: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
6a50: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6a60: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
6a70: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
6a80: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6a90: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
6aa0: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
6ab0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
6ac0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
6ad0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
6ae0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6af0: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
6b00: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6b10: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6b20: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6b40: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6b50: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6b60: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6b70: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6b80: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6b90: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
6ba0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
6bb0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
6bc0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
6bf0: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
6c00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6c10: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6c20: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6c30: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6c40: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6c50: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6c60: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6c70: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6c80: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6c90: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6ca0: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6cb0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6cc0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6cd0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6ce0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6cf0: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6d00: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6d10: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6d20: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6d30: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6d40: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6d50: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6d60: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6d70: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6d80: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6d90: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6da0: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6db0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6dc0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6dd0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6de0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6df0: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6e00: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6e10: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6e20: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6e30: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6e40: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6e50: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6e60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6e70: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6e80: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6e90: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6ea0: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6eb0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6ec0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6ed0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6ee0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6ef0: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6f00: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6f10: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6f20: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6f30: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6f40: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6f50: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6f60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6f70: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6f80: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6f90: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6fa0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6fb0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6fc0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6fd0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6fe0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6ff0: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
7000: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
7010: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
7020: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
7030: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
7040: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
7050: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
7060: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
7070: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
7080: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
7090: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
70a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
70b0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
70c0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
70d0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
70e0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
70f0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
7100: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
7110: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
7120: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
7130: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
7140: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7150: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
7160: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
7170: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
7180: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
7190: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
71a0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
71b0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
71c0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
71d0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
71e0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
71f0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
7200: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
7210: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
7220: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7230: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7240: 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  Y;.        n++;.
7250: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7260: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
7270: 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
7280: 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
7290: 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
72a0: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
72b0: 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
72c0: 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
72d0: 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
72e0: 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
72f0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
7300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
7310: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
7320: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
7330: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
7340: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
7350: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69  azColl[n] = sqli
7360: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
7370: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
7380: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
7390: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
73a0: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
73b0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
73c0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
73d0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
73e0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
73f0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
7400: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
7410: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e  rBINARY;.      n
7420: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
7430: 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43  assert( n==nKeyC
7440: 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  ol );.  pIdx->ai
7450: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52  Column[n] = XN_R
7460: 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  OWID;.  pIdx->az
7470: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7480: 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f  3StrBINARY;..  /
7490: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
74a0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
74b0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
74c0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
74d0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
74e0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
74f0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
7500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7510: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
7520: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
7530: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
7540: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
7550: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
7560: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
7570: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
7580: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
7590: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
75a0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
75b0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
75c0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
75d0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
75e0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
75f0: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
7600: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
7610: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
7620: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
7630: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
7640: 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72  .    addrCounter
7650: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7660: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7670: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
7680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7690: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
76a0: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
76b0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
76c0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
76d0: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
76e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
76f0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
7700: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
7710: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7720: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7730: 78 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70  xt row of %s", p
7740: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
7750: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
7760: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
7770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7780: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
7790: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
77a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
77b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
77c0: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
77d0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
77e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
77f0: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
7800: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
7810: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
7820: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
7830: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
7840: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
7850: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
7860: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
7870: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
7880: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
7890: 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73  );.  regBase = s
78a0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
78b0: 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50  dexKey(.      pP
78c0: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
78d0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
78e0: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
78f0: 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65   0.  );.  sqlite
7900: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7910: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
7920: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
7930: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
7940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7950: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
7960: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
7970: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
7980: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
7990: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
79a0: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
79b0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
79c0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
79d0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
79e0: 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67  addrCounter, reg
79f0: 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73  Base+n);.    tes
7a00: 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
7a10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7a20: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7a30: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7a40: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7a50: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
7a80: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29  m->regResult, 1)
7a90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7aa0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
7ab0: 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d  );.    pTabItem-
7ac0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
7ad0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7ae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7af0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
7b00: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7b10: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
7b20: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7b30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
7b40: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
7b50: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
7b60: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
7b70: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7b80: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
7b90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7ba0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7bb0: 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a  Record);.  .  /*
7bc0: 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
7bd0: 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
7be0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
7bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7c00: 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
7c10: 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64  );..end_auto_ind
7c20: 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c  ex_create:.  sql
7c30: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7c40: 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74  Parse->db, pPart
7c50: 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ial);.}.#endif /
7c60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
7c70: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
7c80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7c90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7ca0: 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
7cb0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
7cc0: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
7cd0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
7ce0: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
7cf0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
7d00: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
7d10: 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
7d20: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
7d30: 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
7d40: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
7d50: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
7d60: 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
7d70: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
7d80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7d90: 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
7da0: 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
7db0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
7dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7dd0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
7de0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7df0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
7e00: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
7e10: 45 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  E clause being a
7e20: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
7e30: 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20  mask mUnusable, 
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e50: 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74  Ignore terms wit
7e60: 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20  h these prereqs 
7e70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7e80: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
7e90: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
7ea0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
7eb0: 74 20 69 73 20 74 68 65 20 76 74 61 62 20 2a 2f  t is the vtab */
7ec0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
7ed0: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20  derBy,          
7ee0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
7ef0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
7f00: 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20  16 *pmNoOmit    
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f20: 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20  * Mask of terms 
7f30: 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29  not to omit */.)
7f40: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
7f50: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
7f60: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7f70: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
7f80: 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
7f90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
7fa0: 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
7fb0: 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
7fc0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7fd0: 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
7fe0: 73 61 67 65 3b 0a 20 20 73 74 72 75 63 74 20 48  sage;.  struct H
7ff0: 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a  iddenIndexInfo *
8000: 70 48 69 64 64 65 6e 3b 0a 20 20 57 68 65 72 65  pHidden;.  Where
8010: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
8020: 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
8030: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8040: 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 75  o *pIdxInfo;.  u
8050: 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a  16 mNoOmit = 0;.
8060: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
8070: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
8080: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
8090: 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
80a0: 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
80b0: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
80c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
80d0: 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
80e0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
80f0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
8100: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
8110: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
8120: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
8130: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
8140: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
8150: 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20  t & mUnusable ) 
8160: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
8170: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8180: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
8190: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
81a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
81b0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
81c0: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
81d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
81e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
81f0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
8200: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8210: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8220: 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IS );.    testca
8230: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
8240: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b  ator & WO_ALL );
8250: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57  >eOperator & ~(W
8270: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
8280: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
8290: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
82a0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
82b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
82c0: 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ert( pTerm->u.le
82d0: 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29  ftColumn>=(-1) )
82e0: 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
82f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
8300: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8310: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
8320: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
8330: 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
8340: 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
8350: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
8360: 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
8370: 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
8380: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8390: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
83a0: 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
83b0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
83c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
83d0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
83e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
83f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  n; i++){.      E
8400: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
8410: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8420: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
8430: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
8440: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
8450: 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
8460: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
8470: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a  .    if( i==n){.
8480: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
8490: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   n;.    }.  }.. 
84a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
84b0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
84c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
84d0: 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
84e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
84f0: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
8500: 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
8510: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
8530: 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
8540: 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
8550: 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
8580: 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
8590: 64 65 72 42 79 20 2b 20 73 69 7a 65 6f 66 28 2a  derBy + sizeof(*
85a0: 70 48 69 64 64 65 6e 29 20 29 3b 0a 20 20 69 66  pHidden) );.  if
85b0: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
85c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
85d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
85e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
85f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8600: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8610: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
8620: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
8630: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
8640: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
8650: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
8660: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
8670: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
8680: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
8690: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
86a0: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
86b0: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
86c0: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
86d0: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
86e0: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
86f0: 2e 0a 20 20 2a 2f 0a 20 20 70 48 69 64 64 65 6e  ..  */.  pHidden
8700: 20 3d 20 28 73 74 72 75 63 74 20 48 69 64 64 65   = (struct Hidde
8710: 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64  nIndexInfo*)&pId
8720: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
8730: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
8740: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8750: 73 74 72 61 69 6e 74 2a 29 26 70 48 69 64 64 65  straint*)&pHidde
8760: 6e 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  n[1];.  pIdxOrde
8770: 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
8780: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
8790: 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
87a0: 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
87b0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
87c0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
87d0: 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
87e0: 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
87f0: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
8800: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
8810: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
8820: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
8830: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
8840: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
8850: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8860: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
8870: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8880: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
8890: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
88a0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
88b0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
88c0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
88d0: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
88e0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
88f0: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
8900: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
8910: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 70 55 73 61 67 65 3b 0a 0a 20 20 70 48 69 64 64  pUsage;..  pHidd
8970: 65 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  en->pWC = pWC;. 
8980: 20 70 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65   pHidden->pParse
8990: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
89a0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
89b0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
89c0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
89d0: 29 7b 0a 20 20 20 20 75 31 36 20 6f 70 3b 0a 20  ){.    u16 op;. 
89e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
89f0: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
8a00: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
8a10: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8a20: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
8a30: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
8a40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
8a50: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
8a60: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
8a70: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8aa0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
8ab0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
8ac0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8ad0: 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IS );.    testc
8ae0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
8af0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
8b00: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
8b10: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8b20: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
8b30: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8b40: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
8b50: 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
8b60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8b70: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
8b80: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
8b90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8ba0: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
8bb0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
8bc0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
8bd0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
8be0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
8bf0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 70 54  oin).     && (pT
8c00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8c10: 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c   (WO_IS|WO_ISNUL
8c20: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
8c30: 20 2f 2a 20 41 6e 20 22 49 53 22 20 74 65 72 6d   /* An "IS" term
8c40: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
8c50: 61 75 73 65 20 77 68 65 72 65 20 74 68 65 20 76  ause where the v
8c60: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
8c70: 74 68 65 20 72 68 73 0a 20 20 20 20 20 20 2a 2a  the rhs.      **
8c80: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
8c90: 20 44 6f 20 6e 6f 74 20 70 61 73 73 20 74 68 69   Do not pass thi
8ca0: 73 20 74 65 72 6d 20 74 6f 20 74 68 65 20 76 69  s term to the vi
8cb0: 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
8cc0: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
8cd0: 69 6f 6e 2c 20 61 73 20 74 68 69 73 20 63 61 6e  ion, as this can
8ce0: 20 6c 65 61 64 20 74 6f 20 69 6e 63 6f 72 72 65   lead to incorre
8cf0: 63 74 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ct results from 
8d00: 53 51 4c 20 73 75 63 68 0a 20 20 20 20 20 20 2a  SQL such.      *
8d10: 2a 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  * as:.      **. 
8d20: 20 20 20 20 20 2a 2a 20 20 20 22 4c 45 46 54 20       **   "LEFT 
8d30: 4a 4f 49 4e 20 76 74 61 62 20 57 48 45 52 45 20  JOIN vtab WHERE 
8d40: 76 74 61 62 2e 63 6f 6c 20 49 53 20 4e 55 4c 4c  vtab.col IS NULL
8d50: 22 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  "  */.      test
8d60: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8d70: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
8d80: 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
8d90: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8da0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
8db0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
8dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
8dd0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
8de0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
8df0: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
8e00: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
8e10: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
8e20: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8e30: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
8e40: 0a 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d  .    op = pTerm-
8e50: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8e60: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
8e70: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
8e80: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  _EQ;.    if( op=
8e90: 3d 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20 20 20  =WO_AUX ){.     
8ea0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
8eb0: 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f  = pTerm->eMatchO
8ec0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
8ed0: 20 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c   op & (WO_ISNULL
8ee0: 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
8ef0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55   if( op==WO_ISNU
8f00: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  LL ){.        pI
8f10: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53  dxCons[j].op = S
8f20: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8f30: 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20  TRAINT_ISNULL;. 
8f40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8f50: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8f60: 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  op = SQLITE_INDE
8f70: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b  X_CONSTRAINT_IS;
8f80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
8f90: 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f  se{.      pIdxCo
8fa0: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f  ns[j].op = (u8)o
8fb0: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;.      /* The 
8fc0: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
8fd0: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
8fe0: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
8ff0: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
9000: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f        ** the WO_
9010: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
9020: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
9030: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
9040: 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
9050: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
9060: 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
9070: 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  act. */.      as
9080: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
9090: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
90a0: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20  AINT_EQ );.     
90b0: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
90c0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
90d0: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
90e0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
90f0: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
9100: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
9110: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
9120: 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
9130: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
9140: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9150: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
9160: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
9170: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _GE );.      ass
9180: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
9190: 72 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57 4f 5f  rator&(WO_IN|WO_
91a0: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
91b0: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 41 55  O_GT|WO_GE|WO_AU
91c0: 58 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  X) );..      if(
91d0: 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f   op & (WO_LT|WO_
91e0: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a  LE|WO_GT|WO_GE).
91f0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
9200: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 54  3ExprIsVector(pT
9210: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
9220: 68 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ht) .      ){.  
9230: 20 20 20 20 20 20 69 66 28 20 69 3c 31 36 20 29        if( i<16 )
9240: 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c   mNoOmit |= (1 <
9250: 3c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  < i);.        if
9260: 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49  ( op==WO_LT ) pI
9270: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57  dxCons[j].op = W
9280: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66  O_LE;.        if
9290: 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49  ( op==WO_GT ) pI
92a0: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57  dxCons[j].op = W
92b0: 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  O_GE;.      }.  
92c0: 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20    }..    j++;.  
92d0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
92e0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
92f0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
9300: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
9310: 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
9320: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
9330: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
9340: 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
9350: 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
9360: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
9370: 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a  tOrder;.  }..  *
9380: 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d  pmNoOmit = mNoOm
9390: 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64  it;.  return pId
93a0: 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
93b0: 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
93c0: 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
93d0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
93e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
93f0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
9400: 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
9410: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
9420: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
9430: 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
9440: 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
9450: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
9460: 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
9470: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f  te3_index_info o
9480: 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
9490: 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72  mes in as the 3r
94a0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
94b0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
94c0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
94d0: 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
94e0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
94f0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9500: 20 61 6e 64 20 61 6e 0a 2a 2a 20 61 70 70 72 6f   and an.** appro
9510: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
9520: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
9530: 41 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  A return of SQLI
9540: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 72  TE_CONSTRAINT fr
9550: 6f 6d 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  om.** xBestIndex
9560: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
9570: 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 20 53 51  ed an error.  SQ
9580: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
9590: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
95a0: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  * the current co
95b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 22  nfiguration of "
95c0: 75 6e 75 73 61 62 6c 65 22 20 66 6c 61 67 73 20  unusable" flags 
95d0: 69 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  in sqlite3_index
95e0: 5f 69 6e 66 6f 20 63 61 6e 0a 2a 2a 20 6e 6f 74  _info can.** not
95f0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 76 61 6c   result in a val
9600: 69 64 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 57  id plan..**.** W
9610: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
9620: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
9630: 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
9640: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
9650: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
9660: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
9670: 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
9680: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
9690: 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
96a0: 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
96b0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
96c0: 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
96d0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
96e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
96f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
9700: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
9710: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
9720: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
9730: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
9740: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  ->pVtab;.  int r
9750: 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
9760: 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
9770: 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
9780: 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
9790: 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
97a0: 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
97b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
97c0: 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
97d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
97e0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
97f0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
9800: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
9810: 6c 74 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  lt(pParse->db);.
9820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
9830: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
9840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9850: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9860: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
9870: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
9880: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9890: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
98a0: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
98b0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
98c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
98d0: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
98e0: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
98f0: 4d 73 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Msg = 0;.  retur
9900: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
9910: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
9920: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9930: 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  BLE) */..#ifdef 
9940: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9950: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
9960: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
9970: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61  location of a pa
9980: 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f  rticular key amo
9990: 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61  ng all keys in a
99a0: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f  n.** index.  Sto
99b0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
99c0: 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f  n aStat as follo
99d0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74  ws:.**.**    aSt
99e0: 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20  at[0]      Est. 
99f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c  number of rows l
9a00: 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a  ess than pRec.**
9a10: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20      aStat[1]    
9a20: 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
9a30: 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70   rows equal to p
9a40: 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  Rec.**.** Return
9a50: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
9a60: 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  e sample that is
9a70: 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61   the smallest sa
9a80: 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  mple that.** is 
9a90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9aa0: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e  equal to pRec. N
9ab0: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e  ote that this in
9ac0: 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  dex is not an in
9ad0: 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  dex.** into the 
9ae0: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20  aSample[] array 
9af0: 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78  - it is an index
9b00: 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20   into a virtual 
9b10: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a  set of samples.*
9b20: 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  * based on the c
9b30: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70  ontents of aSamp
9b40: 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d  le[] and the num
9b50: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9b60: 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63   record .** pRec
9b70: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
9b80: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a   whereKeyStats(.
9b90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9bb0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9bc0: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
9bd0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
9be0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
9bf0: 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69  o consider domai
9c00: 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  n of */.  Unpack
9c10: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20  edRecord *pRec, 
9c20: 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
9c30: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e  of values to con
9c40: 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  sider */.  int r
9c50: 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20  oundUp,         
9c60: 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20         /* Round 
9c70: 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75  up if true.  Rou
9c80: 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65  nd down if false
9c90: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
9ca0: 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20  Stat            
9cb0: 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20    /* OUT: stats 
9cc0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
9cd0: 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  ){.  IndexSample
9ce0: 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78   *aSample = pIdx
9cf0: 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74  ->aSample;.  int
9d00: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
9d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9d20: 78 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74  x of required st
9d30: 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74  ats in anEq[] et
9d40: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  c. */.  int i;  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9d70: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20  first sample >= 
9d80: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53  pRec */.  int iS
9d90: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ample;          
9da0: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
9db0: 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20  t sample larger 
9dc0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9dd0: 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pRec */.  int i
9de0: 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Min = 0;        
9df0: 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
9e00: 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65  st sample not ye
9e10: 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  t tested */.  in
9e20: 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20  t iTest;        
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
9e40: 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74  t sample to test
9e50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63    /* Result of c
9e80: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
9e90: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ion */.  int nFi
9ea0: 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
9eb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9ec0: 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63  f fields in pRec
9ed0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c   */.  tRowcnt iL
9ee0: 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ower = 0;       
9ef0: 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e    /* anLt[] + an
9f00: 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20  Eq[] of largest 
9f10: 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e  sample pRec is >
9f20: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
9f30: 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53  ITE_DEBUG.  UNUS
9f40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50  ED_PARAMETER( pP
9f50: 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20  arse );.#endif. 
9f60: 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30   assert( pRec!=0
9f70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
9f80: 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
9f90: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d  .  assert( pRec-
9fa0: 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65  >nField>0 && pRe
9fb0: 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d  c->nField<=pIdx-
9fc0: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a  >nSampleCol );..
9fd0: 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79    /* Do a binary
9fe0: 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20   search to find 
9ff0: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
a000: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
a010: 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70   equal.  ** to p
a020: 52 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e  Rec. If pRec con
a030: 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66  tains a single f
a040: 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66  ield, the set of
a050: 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72   samples to sear
a060: 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c  ch.  ** is simpl
a070: 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  y the aSample[] 
a080: 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61  array. If the sa
a090: 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
a0a0: 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a  [] contain more.
a0b0: 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69    ** than one fi
a0c0: 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73  elds, all fields
a0d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66   following the f
a0e0: 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64  irst are ignored
a0f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
a100: 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66  Rec contains N f
a110: 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69  ields, where N i
a120: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c  s more than one,
a130: 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73   then as well as
a140: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   the.  ** sample
a150: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28  s in aSample[] (
a160: 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66  truncated to N f
a170: 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72  ields), the sear
a180: 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20  ch also has to. 
a190: 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65   ** consider pre
a1a0: 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73  fixes of those s
a1b0: 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d  amples. For exam
a1c0: 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20  ple, if the set 
a1d0: 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20  of samples.  ** 
a1e0: 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20  in aSample is:. 
a1f0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61   **.  **     aSa
a200: 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29  mple[0] = (a, 5)
a210: 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70   .  **     aSamp
a220: 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20  le[1] = (a, 10) 
a230: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a240: 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20  e[2] = (b, 5) . 
a250: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a260: 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20  3] = (c, 100) . 
a270: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a280: 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20  4] = (c, 105).  
a290: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
a2a0: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68   search space sh
a2b0: 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20  ould ideally be 
a2c0: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76  the samples abov
a2d0: 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  e and the .  ** 
a2e0: 75 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20  unique prefixes 
a2f0: 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d  [a], [b] and [c]
a300: 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74  . But since that
a310: 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61   is hard to orga
a320: 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20  nize, .  ** the 
a330: 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65  code actually se
a340: 61 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a  arches this set:
a350: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30  .  **.  **     0
a360: 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (a) .  **     
a370: 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20  1: (a, 5) .  ** 
a380: 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a      2: (a, 10) .
a390: 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20    **     3: (a, 
a3a0: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a  10) .  **     4:
a3b0: 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35   (b) .  **     5
a3c0: 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (b, 5) .  **  
a3d0: 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20     6: (c) .  ** 
a3e0: 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20      7: (c, 100) 
a3f0: 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c  .  **     8: (c,
a400: 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39   105).  **     9
a410: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a  : (c, 105).  **.
a420: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61    ** For each sa
a430: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d  mple in the aSam
a440: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73  ple[] array, N s
a450: 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65  amples are prese
a460: 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65  nt in the.  ** e
a470: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20  ffective sample 
a480: 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62  array. In the ab
a490: 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61  ove, samples 0 a
a4a0: 6e 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f  nd 1 are based o
a4b0: 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61  n .  ** sample a
a4c0: 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c  Sample[0]. Sampl
a4d0: 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53  es 2 and 3 on aS
a4e0: 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20  ample[1] etc..  
a4f0: 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73  **.  ** Often, s
a500: 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20  ample i of each 
a510: 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63  block of N effec
a520: 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73  tive samples has
a530: 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20   (i+1) fields.. 
a540: 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68   ** Except, each
a550: 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65   sample may be e
a560: 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72  xtended to ensur
a570: 65 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65  e that it is gre
a580: 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a  ater than or.  *
a590: 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70  * equal to the p
a5a0: 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69  revious sample i
a5b0: 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72  n the array. For
a5c0: 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65   example, in the
a5d0: 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61   above, .  ** sa
a5e0: 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69  mple 2 is the fi
a5f0: 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20  rst sample of a 
a600: 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c  block of N sampl
a610: 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20  es, so at first 
a620: 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73  it .  ** appears
a630: 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
a640: 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69  be 1 field in si
a650: 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61  ze. However, tha
a660: 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20  t would make it 
a670: 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  .  ** smaller th
a680: 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20  an sample 1, so 
a690: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
a6a0: 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b  h would not work
a6b0: 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a  . As a result, .
a6c0: 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e    ** it is exten
a6d0: 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64  ded to two field
a6e0: 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65  s. The duplicate
a6f0: 73 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61  s that this crea
a700: 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a  tes do not .  **
a710: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
a720: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65  ems..  */.  nFie
a730: 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ld = pRec->nFiel
a740: 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20  d;.  iCol = 0;. 
a750: 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   iSample = pIdx-
a760: 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c  >nSample * nFiel
a770: 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74  d;.  do{.    int
a780: 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20   iSamp;         
a790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a7a0: 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  dex in aSample[]
a7b0: 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20   of test sample 
a7c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  */.    int n;   
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a7f0: 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74  f fields in test
a800: 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20   sample */..    
a810: 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53  iTest = (iMin+iS
a820: 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53  ample)/2;.    iS
a830: 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46  amp = iTest / nF
a840: 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53  ield;.    if( iS
a850: 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  amp>0 ){.      /
a860: 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65  * The proposed e
a870: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20  ffective sample 
a880: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73  is a prefix of s
a890: 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53  ample aSample[iS
a8a0: 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53  amp]..      ** S
a8b0: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
a8c0: 20 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78   shortest prefix
a8d0: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20   of at least (1 
a8e0: 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20  + iTest%nField) 
a8f0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  .      ** fields
a900: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a910: 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
a920: 75 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  us effective sam
a930: 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  ple.  */.      f
a940: 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46  or(n=(iTest % nF
a950: 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69  ield) + 1; n<nFi
a960: 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  eld; n++){.     
a970: 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
a980: 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31  Samp-1].anLt[n-1
a990: 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  ]!=aSample[iSamp
a9a0: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72  ].anLt[n-1] ) br
a9b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a9c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
a9d0: 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20  = iTest + 1;.   
a9e0: 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46   }..    pRec->nF
a9f0: 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65  ield = n;.    re
aa00: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
aa10: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
aa20: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61  mple[iSamp].n, a
aa30: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c  Sample[iSamp].p,
aa40: 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20   pRec);.    if( 
aa50: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
aa60: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
aa70: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
aa80: 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   + aSample[iSamp
aa90: 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20  ].anEq[n-1];.   
aaa0: 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
aab0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
aac0: 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69   res==0 && n<nFi
aad0: 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  eld ){.      iLo
aae0: 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53  wer = aSample[iS
aaf0: 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a  amp].anLt[n-1];.
ab00: 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65        iMin = iTe
ab10: 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20  st+1;.      res 
ab20: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
ab30: 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d  .      iSample =
ab40: 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43   iTest;.      iC
ab50: 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a  ol = n-1;.    }.
ab60: 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26    }while( res &&
ab70: 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b   iMin<iSample );
ab80: 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f  .  i = iSample /
ab90: 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66   nField;..#ifdef
aba0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
abb0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
abc0: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
abd0: 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ts check that th
abe0: 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
abf0: 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20  code.  ** above 
ac00: 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20  found the right 
ac10: 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f  answer. This blo
ac20: 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72  ck serves no pur
ac30: 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20  pose other.  ** 
ac40: 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  than to invoke t
ac50: 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a  he asserts.  */.
ac60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
ac70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
ac80: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  0 ){.    if( res
ac90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
aca0: 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
acb0: 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  rue, then pRec m
acc0: 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20  ust be equal to 
acd0: 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20  sample i. */.   
ace0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
acf0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
ad00: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
ad10: 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20  ==nField-1 );.  
ad20: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
ad30: 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20   = nField;.     
ad40: 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
ad50: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
ad60: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
ad70: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
ad80: 20 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20   pRec) .        
ad90: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
ada0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a  ->mallocFailed .
adb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
adc0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c  se{.      /* Unl
add0: 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  ess i==pIdx->nSa
ade0: 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67  mple, indicating
adf0: 20 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61   that pRec is la
ae00: 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  rger than.      
ae10: 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69  ** all samples i
ae20: 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
ae30: 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74  array, pRec must
ae40: 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
ae50: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69   the.      ** (i
ae60: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
ae70: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e  fix of sample i.
ae80: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
ae90: 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i<=pIdx->nSam
aea0: 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20  ple && i>=0 );. 
aeb0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
aec0: 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20  d = iCol+1;.    
aed0: 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64    assert( i==pId
aee0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  x->nSample .    
aef0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
af00: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
af10: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
af20: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
af30: 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20  Rec)>0.         
af40: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
af50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
af60: 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d  ..      /* if i=
af70: 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20  =0 and iCol==0, 
af80: 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63  then record pRec
af90: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
afa0: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20   all samples.   
afb0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61     ** in the aSa
afc0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74  mple[] array. Ot
afd0: 68 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f  herwise, if (iCo
afe0: 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d  l>0) then pRec m
aff0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
b000: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
b010: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43  equal to the (iC
b020: 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  ol) field prefix
b030: 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20   of sample i..  
b040: 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c      ** If (i>0),
b050: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
b060: 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20  also be greater 
b070: 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31  than sample (i-1
b080: 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ).  */.      if(
b090: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
b0a0: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
b0b0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
b0c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
b0d0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
b0e0: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
b0f0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
b100: 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20  c)<=0.          
b110: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
b120: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b140: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
b150: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
b160: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
b170: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b180: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
b190: 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  re(aSample[i-1].
b1a0: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  n, aSample[i-1].
b1b0: 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20  p, pRec)<0.     
b1c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
b1d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
b1e0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
b1f0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b200: 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
b210: 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20  DEBUG */..  if( 
b220: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  res==0 ){.    /*
b230: 20 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   Record pRec is 
b240: 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20  equal to sample 
b250: 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  i */.    assert(
b260: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
b270: 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  );.    aStat[0] 
b280: 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
b290: 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
b2a0: 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
b2b0: 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
b2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
b2d0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
b2e0: 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  e (iCol+1) field
b2f0: 20 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70   prefix of aSamp
b300: 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
b310: 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c  st .    ** sampl
b320: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
b330: 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c  r than pRec. Or,
b340: 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61   if i==pIdx->nSa
b350: 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20  mple then pRec. 
b360: 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20     ** is larger 
b370: 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
b380: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a   in the array. *
b390: 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  /.    tRowcnt iU
b3a0: 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
b3b0: 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  if( i>=pIdx->nSa
b3c0: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55  mple ){.      iU
b3d0: 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pper = sqlite3Lo
b3e0: 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e  gEstToInt(pIdx->
b3f0: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
b400: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b410: 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
b420: 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
b430: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
b440: 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
b450: 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
b460: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
b470: 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
b480: 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
b490: 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
b4a0: 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
b4b0: 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
b4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b4d0: 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
b4e0: 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
b4f0: 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
b500: 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
b510: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e 46   pIdx->aAvgEq[nF
b520: 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20  ield-1];.  }..  
b530: 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 70  /* Restore the p
b540: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75  Rec->nField valu
b550: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
b560: 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e  ng.  */.  pRec->
b570: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
b580: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23  .  return i;.}.#
b590: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b5a0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
b5b0: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
b5c0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
b5d0: 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
b5e0: 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
b5f0: 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
b600: 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
b610: 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
b620: 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
b630: 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
b640: 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
b650: 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
b660: 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
b670: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
b680: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
b690: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
b6a0: 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
b6b0: 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
b6c0: 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
b6d0: 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
b6e0: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
b6f0: 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
b700: 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
b710: 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
b720: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
b730: 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
b740: 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
b750: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b760: 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
b770: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
b780: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
b790: 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
b7a0: 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
b7b0: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
b7c0: 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
b7d0: 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
b7e0: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
b7f0: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
b800: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
b810: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
b820: 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
b830: 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
b840: 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
b850: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
b860: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
b870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
b880: 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
b890: 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
b8a0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
b8b0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
b8c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
b8d0: 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
b8e0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
b8f0: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
b900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b910: 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69  urn nRet;.}...#i
b920: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b930: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
b940: 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  4./*.** Return t
b950: 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20  he affinity for 
b960: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
b970: 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  of an index..*/.
b980: 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65  char sqlite3Inde
b990: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
b9a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
b9b0: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43  ex *pIdx, int iC
b9c0: 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ol){.  assert( i
b9d0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
b9e0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
b9f0: 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f    if( !pIdx->zCo
ba00: 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20  lAff ){.    if( 
ba10: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
ba20: 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64 78  nityStr(db, pIdx
ba30: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
ba40: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ba50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78   }.  return pIdx
ba60: 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b  ->zColAff[iCol];
ba70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
ba80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ba90: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
baa0: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
bab0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
bac0: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
bad0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
bae0: 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61  sited by a.** ra
baf0: 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b  nge-scan on a sk
bb00: 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46  ip-scan index. F
bb10: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
bb20: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
bb30: 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20   i1 ON t1(a, b, 
bb40: 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  c);.**   SELECT 
bb50: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
bb60: 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45  a=? AND c BETWEE
bb70: 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a  N ? AND ?;.**.**
bb80: 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f   Value pLoop->nO
bb90: 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ut is currently 
bba0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
bbb0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
bbc0: 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  ows .** visited 
bbd0: 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d  for scanning (a=
bbe0: 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73  ? AND b=?). This
bbf0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65   function reduce
bc00: 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65 20  s that estimate 
bc10: 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74  .** by some fact
bc20: 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  or to account fo
bc30: 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45 4e  r the (c BETWEEN
bc40: 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73   ? AND ?) expres
bc50: 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e  sion based.** on
bc60: 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61 20   the stat4 data 
bc70: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74  for the index. t
bc80: 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  his scan will be
bc90: 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70   peformed multip
bca0: 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e  le .** times (on
bcb0: 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62  ce for each (a,b
bcc0: 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68  ) combination th
bcd0: 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20  at matches a=?) 
bce0: 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a  is dealt with .*
bcf0: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
bd00: 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74  .**.** It does t
bd10: 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  his by scanning 
bd20: 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74  through all stat
bd30: 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61  4 samples, compa
bd40: 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65  ring values.** e
bd50: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
bd60: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
bd70: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70  with the corresp
bd80: 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e  onding column in
bd90: 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e   each.** sample.
bda0: 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20   If L and U are 
bdb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
bdc0: 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62  mples found to b
bdd0: 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a  e less than or.*
bde0: 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76  * equal to the v
bdf0: 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20  alues extracted 
be00: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
be10: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
be20: 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73  ely, and.** N is
be30: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
be40: 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68  r of samples, th
be50: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61  e pLoop->nOut va
be60: 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a  lue is adjusted.
be70: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
be80: 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f  *.**   nOut = nO
be90: 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c  ut * ( min(U - L
bea0: 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a  , 1) / N ).**.**
beb0: 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   If pLower is NU
bec0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
bed0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
bee0: 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d  ed from the term
bef0: 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  , L is.** set to
bf00: 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72   zero. If pUpper
bf10: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76   is NULL, or a v
bf20: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65  alue cannot be e
bf30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
bf40: 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f  ,.** U is set to
bf50: 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c   N..**.** Normal
bf60: 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
bf70: 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74  n sets *pbDone t
bf80: 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72  o 1 before retur
bf90: 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ning. However,.*
bfa0: 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61  * if no value ca
bfb0: 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  n be extracted f
bfc0: 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65  rom either pLowe
bfd0: 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64  r or pUpper (and
bfe0: 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d   so the.** estim
bff0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
c000: 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65  r of rows delive
c010: 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  red remains unch
c020: 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a  anged), *pbDone.
c030: 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69 73  ** is left as is
c040: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
c050: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
c060: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
c070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
c080: 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c  herwise, .** SQL
c090: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
c0a0: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
c0b0: 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50  SkipScanEst(.  P
c0c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c0d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
c0e0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
c0f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
c100: 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
c110: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
c120: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
c130: 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
c140: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
c150: 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
c160: 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
c170: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
c180: 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
c190: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c1a0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
c1b0: 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ,    /* Update t
c1c0: 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f  he .nOut value o
c1d0: 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  f this loop */. 
c1e0: 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20   int *pbDone    
c1f0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
c200: 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
c210: 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65   one expr. value
c220: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b   extracted */.){
c230: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
c240: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
c250: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
c260: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
c270: 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nEq;.  sqlite3 *
c280: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c290: 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20  .  int nLower = 
c2a0: 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72  -1;.  int nUpper
c2b0: 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b   = p->nSample+1;
c2c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c2d0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20  TE_OK;.  u8 aff 
c2e0: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
c2f0: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c  lumnAffinity(db,
c300: 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c   p, nEq);.  Coll
c310: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20  Seq *pColl;.  . 
c320: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c330: 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
c340: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
c350: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
c360: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
c370: 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20  ue *p2 = 0;     
c380: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
c390: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70  tracted from pUp
c3a0: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
c3b0: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
c3c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
c3d0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
c3e0: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43   record */..  pC
c3f0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
c400: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
c410: 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71  e, p->azColl[nEq
c420: 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  ]);.  if( pLower
c430: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c440: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
c450: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
c460: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
c470: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b  ight, aff, &p1);
c480: 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b  .    nLower = 0;
c490: 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
c4a0: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
c4b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
c4c0: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
c4d0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
c4e0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
c4f0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32  pRight, aff, &p2
c500: 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20  );.    nUpper = 
c510: 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d  p2 ? 0 : p->nSam
c520: 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ple;.  }..  if( 
c530: 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
c540: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
c550: 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Diff;.    for(i=
c560: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
c570: 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65   && i<p->nSample
c580: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
c590: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43   = sqlite3Stat4C
c5a0: 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61  olumn(db, p->aSa
c5b0: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53  mple[i].p, p->aS
c5c0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c  ample[i].n, nEq,
c5d0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
c5e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c5f0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
c600: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
c610: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31  te3MemCompare(p1
c620: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
c630: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
c640: 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20  =0 ) nLower++;. 
c650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c660: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c670: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
c680: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
c690: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20  3MemCompare(p2, 
c6a0: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
c6b0: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
c6c0: 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20   ) nUpper++;.   
c6d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
c6e0: 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d  Diff = (nUpper -
c6f0: 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66   nLower);.    if
c700: 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69  ( nDiff<=0 ) nDi
c710: 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 1;..    /* 
c720: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
c730: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
c740: 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66  wer bound specif
c750: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20  ied, and the .  
c760: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
c770: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
c780: 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hey are close to
c790: 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20  gether, use the 
c7a0: 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  fallback.    ** 
c7b0: 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74  method (assume t
c7c0: 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73  hat the scan vis
c7d0: 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20  its 1/64 of the 
c7e0: 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61  rows) for estima
c7f0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
c800: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
c810: 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73  isited. Otherwis
c820: 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  e, estimate the 
c830: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
c840: 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
c850: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
c860: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63   in the header c
c870: 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  omment for this 
c880: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
c890: 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c   if( nDiff!=1 ||
c8a0: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c   pUpper==0 || pL
c8b0: 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ower==0 ){.     
c8c0: 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28   int nAdjust = (
c8d0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d  sqlite3LogEst(p-
c8e0: 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69  >nSample) - sqli
c8f0: 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29  te3LogEst(nDiff)
c900: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  );.      pLoop->
c910: 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b  nOut -= nAdjust;
c920: 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d  .      *pbDone =
c930: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
c940: 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
c950: 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67  ge skip-scan reg
c960: 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64  ions: %u..%u  ad
c970: 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e  just=%d est=%d\n
c980: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
c9a0: 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41  ower, nUpper, nA
c9b0: 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d  djust*-1, pLoop-
c9c0: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a  >nOut));.    }..
c9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
c9e0: 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20  ert( *pbDone==0 
c9f0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
ca00: 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a  3ValueFree(p1);.
ca10: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
ca20: 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p2);.  sqlite
ca30: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
ca40: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
ca50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ca60: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ca70: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
ca80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ca90: 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
caa0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
cab0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
cac0: 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
cad0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
cae0: 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
caf0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
cb00: 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
cb10: 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
cb20: 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
cb30: 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
cb40: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
cb50: 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
cb60: 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
cb70: 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
cb80: 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
cb90: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
cba0: 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
cbb0: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
cbc0: 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
cbd0: 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
cbe0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
cbf0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
cc00: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
cc30: 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
cc50: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
cc80: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
cc90: 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
cca0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
ccb0: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
ccc0: 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
ccd0: 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
cce0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
ccf0: 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
cd00: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
cd10: 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
cd20: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
cd30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
cd40: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
cd50: 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
cd60: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
cd70: 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
cd80: 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
cd90: 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
cda0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
cdb0: 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
cdc0: 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
cdd0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
cde0: 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
cdf0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
ce00: 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
ce10: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
ce20: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
ce30: 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
ce40: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
ce50: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
ce60: 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
ce70: 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
ce80: 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
ce90: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
cea0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
ceb0: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
cec0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
ced0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
cee0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
cef0: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
cf00: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
cf10: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
cf20: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
cf30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
cf40: 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
cf50: 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
cf60: 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
cf70: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
cf80: 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
cf90: 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
cfa0: 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
cfb0: 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
cfc0: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
cfd0: 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
cfe0: 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e  q is 0, then *pn
cff0: 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Out is the numbe
d000: 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
d010: 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
d020: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
d030: 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
d040: 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
d050: 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
d060: 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
d070: 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
d080: 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
d090: 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
d0a0: 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
d0b0: 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
d0c0: 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
d0d0: 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
d0e0: 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
d0f0: 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
d100: 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
d110: 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
d120: 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
d130: 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
d140: 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
d150: 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
d160: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
d170: 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
d180: 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
d190: 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
d1a0: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
d1b0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
d1c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d1d0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
d1e0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
d1f0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
d200: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
d210: 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
d220: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
d230: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
d240: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
d250: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
d260: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
d270: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
d280: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
d290: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
d2a0: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
d2b0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
d2c0: 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
d2d0: 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
d2e0: 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
d2f0: 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
d300: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d310: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
d320: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
d330: 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
d340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d350: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
d360: 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
d370: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d380: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
d390: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
d3a0: 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
d3b0: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e  ->nSample>0 && n
d3c0: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
d3d0: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
d3e0: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
d3f0: 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  e->db, SQLITE_St
d400: 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20 20 69  at34).  ){.    i
d410: 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
d420: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
d430: 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
d440: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
d450: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
d460: 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
d470: 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d        int nBtm =
d480: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d490: 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nBtm;.      int 
d4a0: 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  nTop = pLoop->u.
d4b0: 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20  btree.nTop;..   
d4c0: 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
d4d0: 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65  Lower will be se
d4e0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
d4f0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
d500: 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20  of rows in .    
d510: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
d520: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
d530: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
d540: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
d550: 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20  uery. The.      
d560: 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62  ** lower bound b
d570: 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65  eing the concate
d580: 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64  nation of $P and
d590: 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73   $L, where $P is
d5a0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65   the.      ** ke
d5b0: 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20  y-prefix formed 
d5c0: 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  by the nEq value
d5d0: 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  s matched agains
d5e0: 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d  t the nEq left-m
d5f0: 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ost.      ** col
d600: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
d610: 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65  x, and $L is the
d620: 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72   value in pLower
d630: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
d640: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
d650: 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
d660: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
d670: 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
d680: 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a  ause it.      **
d690: 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
d6a0: 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74   variable or lit
d6b0: 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65  eral value), the
d6c0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
d6d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e  the.      ** ran
d6e0: 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f  ge is $P. Due to
d6f0: 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20   a quirk in the 
d700: 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74  way whereKeyStat
d710: 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a  s() works, even.
d720: 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69        ** if $L i
d730: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
d740: 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
d750: 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
d760: 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20  ($P) and .      
d770: 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74  ** ($P:$L) and t
d780: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
d790: 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61   two returned va
d7a0: 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20  lues is used..  
d7b0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d7c0: 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
d7d0: 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
d7e0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
d7f0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d800: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  rows.      ** le
d810: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
d820: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
d830: 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
d840: 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
d850: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  d.      ** is ei
d860: 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
d870: 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
d880: 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
d890: 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
d8a0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55  s.      ** of iU
d8b0: 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
d8c0: 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
d8d0: 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
d8e0: 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
d8f0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
d900: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d910: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
d920: 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20   bounds is then 
d930: 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77  just iUpper-iLow
d940: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
d950: 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
d960: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
d970: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
d980: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
d990: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
d9a0: 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65  ;     /* Rows le
d9b0: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
d9c0: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
d9d0: 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d   int iLwrIdx = -
d9e0: 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  2;   /* aSample[
d9f0: 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20  ] for the lower 
da00: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
da10: 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b  nt iUprIdx = -1;
da20: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
da30: 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62 6f  for the upper bo
da40: 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  und */..      if
da50: 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( pRec ){.      
da60: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63    testcase( pRec
da70: 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64  ->nField!=pBuild
da80: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b  er->nRecValid );
da90: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
daa0: 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72  Field = pBuilder
dab0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20  ->nRecValid;.   
dac0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
dad0: 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
dae0: 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
daf0: 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
db00: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
db10: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
db20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
db30: 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
db40: 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
db50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
db60: 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
db70: 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
db80: 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
db90: 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
dba0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
dbb0: 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
dbc0: 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
dbd0: 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
dbe0: 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
dbf0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
dc00: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
dc10: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
dc20: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
dc30: 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
dc40: 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
dc50: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
dc60: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
dc70: 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
dc80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
dc90: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
dca0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dcb0: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
dcc0: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
dcd0: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
dce0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
dcf0: 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
dd00: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
dd10: 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
dd20: 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
dd30: 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
dd40: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
dd50: 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
dd60: 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
dd70: 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
dd80: 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
dd90: 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
dda0: 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e       SWAP(int, n
ddb0: 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20  Btm, nTop);.    
ddc0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
ddd0: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
dde0: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
ddf0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
de00: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
de10: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
de20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
de50: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
de60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
de70: 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
de80: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
de90: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
dea0: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
deb0: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
dec0: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
ded0: 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b   nBtm, nEq, &n);
dee0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
def0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
df00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
df10: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
df20: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
df30: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
df40: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
df50: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
df60: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
df70: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
df80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
df90: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
dfa0: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
dfb0: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
dfc0: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
dfd0: 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
dfe0: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
dff0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
e000: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
e010: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
e020: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
e030: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
e040: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
e050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e060: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
e070: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
e080: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
e090: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
e0a0: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
e0b0: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
e0c0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
e0f0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
e100: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
e110: 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
e120: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
e130: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e140: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
e150: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
e160: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
e170: 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Top, nEq, &n);. 
e180: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
e190: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
e1a0: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
e1b0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
e1c0: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
e1d0: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
e1e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e1f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
e200: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
e210: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
e220: 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
e230: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
e240: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
e250: 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
e260: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
e270: 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
e280: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
e290: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
e2a0: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
e2b0: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
e2c0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
e2d0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
e2e0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
e2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e300: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
e310: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
e320: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e340: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
e350: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
e360: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
e370: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
e380: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
e390: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
e3a0: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
e3b0: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
e3c0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
e3d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
e3e0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
e3f0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
e400: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
e410: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
e420: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
e430: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
e440: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
e450: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
e460: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
e470: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
e480: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
e490: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
e4a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
e4b0: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
e4c0: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
e4d0: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
e4e0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
e4f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e500: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
e510: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
e520: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
e530: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
e540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e550: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
e560: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
e570: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
e580: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
e590: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
e5a0: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
e5b0: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
e5c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
e5e0: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
e5f0: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
e600: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e610: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
e620: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
e630: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
e640: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
e650: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
e660: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
e670: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
e680: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e690: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
e6a0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e6b0: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
e6c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
e6d0: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
e6e0: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
e6f0: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
e700: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
e710: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
e720: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
e730: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
e740: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
e750: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
e760: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
e770: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
e780: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
e790: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
e7a0: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
e7b0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
e7c0: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
e7d0: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
e7e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
e7f0: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
e800: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
e810: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
e820: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
e830: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
e840: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
e850: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
e860: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
e870: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
e880: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
e890: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
e8a0: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
e8b0: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
e8c0: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
e8d0: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
e8e0: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
e8f0: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
e900: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
e910: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
e920: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
e930: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
e940: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
e950: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
e960: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
e970: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
e980: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
e990: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
e9a0: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
e9b0: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
e9c0: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
e9d0: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
e9e0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
e9f0: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
ea00: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
ea10: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
ea20: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
ea30: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
ea40: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
ea50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ea60: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
ea70: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
ea80: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
ea90: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
eaa0: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
eab0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
eac0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
ead0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
eae0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
eaf0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
eb00: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
eb10: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
eb20: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
eb30: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
eb40: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
eb50: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
eb60: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
eb70: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
eb80: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
eb90: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
eba0: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
ebb0: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
ebc0: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
ebd0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
ebe0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
ebf0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
ec00: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
ec10: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
ec20: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
ec30: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
ec40: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
ec50: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
ec60: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
ec70: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
ec80: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
ec90: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
eca0: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
ecb0: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
ecc0: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
ecd0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
ece0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ecf0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
ed00: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
ed10: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
ed20: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
ed30: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
ed40: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
ed50: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
ed60: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
ed70: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
ed80: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
ed90: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
eda0: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
edb0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
edc0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
edd0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
ede0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
edf0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ee00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
ee10: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
ee20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
ee30: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
ee40: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
ee50: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
ee60: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
ee70: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
ee80: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
ee90: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
eea0: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
eeb0: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
eec0: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
eed0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
eee0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
eef0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
ef00: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
ef10: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
ef20: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
ef30: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
ef40: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
ef50: 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRec;.  int rc;
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
ef80: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
ef90: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efb0: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
efc0: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
efd0: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
efe0: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
eff0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
f000: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
f010: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f020: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
f030: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
f040: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
f050: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
f060: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
f070: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
f080: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
f090: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
f0a0: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
f0b0: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
f0c0: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
f0d0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
f0e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
f0f0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
f100: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
f110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
f120: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
f130: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
f140: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
f150: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f160: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
f170: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
f180: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
f190: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
f1a0: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
f1b0: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
f1c0: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
f1d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f1e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
f1f0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
f200: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
f210: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
f220: 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  1, nEq-1, &bOk);
f230: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
f240: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
f250: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f260: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
f270: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
f280: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
f290: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
f2a0: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
f2b0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
f2c0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
f2d0: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
f2e0: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
f2f0: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
f300: 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c  s %s(%d): %d\n",
f310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f320: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45      p->zName, nE
f330: 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  q-1, (int)a[1]))
f340: 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31  ;.  *pnRow = a[1
f350: 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  ];.  .  return r
f360: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
f370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f380: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
f390: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f3a0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
f3b0: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
f3c0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
f3d0: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
f3e0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
f3f0: 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f  d on.** an IN co
f400: 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74  nstraint where t
f410: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
f420: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
f430: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69  rator.** is a li
f440: 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45  st of values.  E
f450: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
f460: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
f470: 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20  (1,2,3,4).**.** 
f480: 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
f490: 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
f4a0: 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
f4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
f4c0: 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
f4d0: 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
f4e0: 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
f4f0: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
f500: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
f510: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f520: 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
f530: 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
f540: 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
f550: 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
f560: 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
f570: 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
f580: 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
f590: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
f5a0: 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
f5b0: 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
f5c0: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
f5d0: 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
f5e0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
f5f0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
f600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
f610: 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20  ereInScanEst(.  
f620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f630: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f640: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
f650: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
f660: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
f670: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
f680: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
f690: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c    /* The value l
f6a0: 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ist on the RHS o
f6b0: 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76  f "x IN (v1,v2,v
f6c0: 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f  3,...)" */.  tRo
f6d0: 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
f6e0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
f6f0: 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
f700: 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
f710: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
f720: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
f730: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36  ree.pIndex;.  i6
f740: 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65  4 nRow0 = sqlite
f750: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e  3LogEstToInt(p->
f760: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
f770: 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64  .  int nRecValid
f780: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
f790: 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63  cValid;.  int rc
f7a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
f7b0: 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
f7c0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
f7d0: 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
f7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f7f0: 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
f800: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
f810: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
f820: 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
f830: 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
f840: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
f850: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f870: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f880: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
f890: 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
f8a0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
f8b0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
f8c0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f8d0: 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b     nEst = nRow0;
f8e0: 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45  .    rc = whereE
f8f0: 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
f900: 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c  se, pBuilder, pL
f910: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
f920: 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
f930: 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
f940: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
f950: 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
f960: 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  d;.  }..  if( rc
f970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f980: 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
f990: 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74   nRow0 ) nRowEst
f9a0: 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70   = nRow0;.    *p
f9b0: 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
f9c0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
f9d0: 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
f9e0: 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22  imate: est=%d\n"
f9f0: 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
fa00: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
fa10: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
fa20: 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
fa30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
fa40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
fa50: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
fa60: 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57  T4 */...#ifdef W
fa70: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
fa80: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  D./*.** Print th
fa90: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
faa0: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a  hereTerm object.
fab0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
fac0: 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68  hereTermPrint(Wh
fad0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
fae0: 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66  int iTerm){.  if
faf0: 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ( pTerm==0 ){.  
fb00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fb10: 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20  intf("TERM-%-3d 
fb20: 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b  NULL\n", iTerm);
fb30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
fb40: 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20  ar zType[4];.   
fb50: 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b   char zLeft[50];
fb60: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
fb70: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
fb80: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
fb90: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
fba0: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
fbb0: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
fbc0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fbd0: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
fbe0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
fbf0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
fc00: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
fc10: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
fc20: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
fc30: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fc40: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
fc50: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20  SINGLE ){.      
fc60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
fc70: 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a  (sizeof(zLeft),z
fc80: 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25  Left,"left={%d:%
fc90: 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72              pTer
fcb0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70  m->leftCursor, p
fcc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
fcd0: 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  mn);.    }else i
fce0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
fcf0: 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
fd00: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   && pTerm->u.pOr
fd10: 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20  Info!=0 ){.     
fd20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fd30: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
fd40: 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65  zLeft,"indexable
fd50: 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20  =0x%lld", .     
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
fd80: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a  fo->indexable);.
fd90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fda0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fdb0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
fdc0: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c  zLeft,"left=%d",
fdd0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
fde0: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  or);.    }.    s
fdf0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fe00: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
fe10: 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32 73  %-3d %p %s %-12s
fe20: 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78   prob=%-3d op=0x
fe30: 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25  %03x wtFlags=0x%
fe40: 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65  04x",.       iTe
fe50: 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65  rm, pTerm, zType
fe60: 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e  , zLeft, pTerm->
fe70: 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20  truthProb,.     
fe80: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
fe90: 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  or, pTerm->wtFla
fea0: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  gs);.    if( pTe
feb0: 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20  rm->iField ){.  
fec0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
fed0: 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d  Printf(" iField=
fee0: 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46  %d\n", pTerm->iF
fef0: 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ield);.    }else
ff00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
ff10: 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
ff20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ff30: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
ff40: 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
ff50: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
ff60: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
ff70: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
ff80: 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  ** Show the comp
ff90: 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
ffa0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f  a WhereClause.*/
ffb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
ffc0: 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68  reClausePrint(Wh
ffd0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
ffe0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
fff0: 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  i=0; i<pWC->nTer
10000 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65  m; i++){.    whe
10010 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43  reTermPrint(&pWC
10020 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a  ->a[i], i);.  }.
10030 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
10040 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
10050 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
10060 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10070 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
10080 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
10090 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
100a0 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
100b0 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
100c0 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
100d0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
100e0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
100f0 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
10100 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
10110 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20  +3)/4;.  struct 
10120 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
10130 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
10140 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
10150 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
10160 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
10170 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c  ;.  Bitmask mAll
10180 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   = (((Bitmask)1)
10190 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20  <<(nb*4)) - 1;. 
101a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
101b0 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
101c0 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
101d0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
101e0 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
101f0 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
10200 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20  , nb, p->prereq 
10210 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  & mAll);.  sqlit
10220 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
10230 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %12s",.         
10240 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
10250 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
10260 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
10270 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
10280 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10290 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
102a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
102b0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
102c0 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
102d0 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
102e0 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
102f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
10300 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
10310 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
10320 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
10330 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
10340 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
10350 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
10360 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
10370 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
10380 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
10390 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
103a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
103b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
103c0 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
103d0 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
103e0 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
103f0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
10400 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
10410 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
10420 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
10430 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
10440 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
10450 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
10460 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
10470 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
10480 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
10490 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
104a0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
104b0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
104c0 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
104d0 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
104e0 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
104f0 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
10500 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
10510 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
10520 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
10530 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
10540 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
10550 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
10560 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
10570 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
10580 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
10590 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
105a0 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e  %05x %d-%d", p->
105b0 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
105c0 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20  rm,p->nSkip);.  
105d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
105e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
105f0 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d  f %05x N %d", p-
10600 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
10610 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  erm);.  }.  sqli
10620 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10630 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
10640 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
10650 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
10660 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
10670 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
10680 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
10690 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
106a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
106b0 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
106c0 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
106d0 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b  Print(p->aLTerm[
106e0 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  i], i);.    }.  
106f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
10700 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
10710 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
10720 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
10730 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
10740 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
10750 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
10760 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10770 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
10780 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
10790 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
107a0 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
107b0 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
107c0 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
107d0 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
107e0 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
107f0 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
10800 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
10810 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
10820 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
10830 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
10840 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10850 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
10860 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10870 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
10880 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
10890 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
108a0 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
108b0 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
108c0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
108d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
108e0 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
108f0 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
10900 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10910 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
10920 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
10930 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
10940 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
10950 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
10960 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
10970 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10980 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
10990 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
109a0 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
109b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
109c0 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
109d0 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
109e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
109f0 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74  eeNN(db, p->u.bt
10a00 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
10a10 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
10a20 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
10a30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
10a40 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
10a50 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
10a60 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10a70 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10a80 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
10a90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
10aa0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
10ab0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
10ac0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
10ad0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
10ae0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10af0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
10b00 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
10b10 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
10b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
10b30 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
10b40 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
10b50 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
10b60 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
10b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
10b80 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
10b90 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
10ba0 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
10bb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
10bc0 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
10bd0 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
10be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
10bf0 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
10c00 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
10c10 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
10c20 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
10c30 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
10c40 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
10c50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10c60 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  T;.  memcpy(paNe
10c70 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
10c80 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
10c90 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
10ca0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
10cb0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
10cc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
10cd0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
10ce0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
10cf0 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
10d00 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
10d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10d20 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
10d30 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
10d40 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
10d50 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
10d60 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
10d70 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
10d80 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10d90 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
10da0 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
10db0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
10dc0 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
10dd0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
10de0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
10df0 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
10e00 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
10e10 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
10e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e30 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10e40 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  }.  memcpy(pTo, 
10e50 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
10e60 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
10e70 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
10e80 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
10e90 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
10ea0 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
10eb0 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
10ec0 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
10ed0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
10ee0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
10ef0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
10f00 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
10f10 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
10f20 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
10f30 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
10f40 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
10f50 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
10f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10f70 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10f80 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10f90 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10fa0 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
10fb0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10fc0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
10fd0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
10fe0 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
10ff0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
11000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11010 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
11020 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
11030 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
11040 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
11050 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
11060 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
11070 73 65 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20  sert( pWInfo!=0 
11080 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
11090 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
110a0 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  i++){.    WhereL
110b0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
110c0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
110d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57    if( pLevel->pW
110e0 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d  Loop && (pLevel-
110f0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
11100 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
11110 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
11120 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
11130 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
11140 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
11150 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
11160 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
11170 3e 73 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20  >sWC);.  while( 
11180 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
11190 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  {.    WhereLoop 
111a0 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
111b0 6f 70 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ops;.    pWInfo-
111c0 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65  >pLoops = p->pNe
111d0 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  xtLoop;.    wher
111e0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
111f0 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
11200 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57  3DbFreeNN(db, pW
11210 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
11220 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
11230 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
11240 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
11250 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
11260 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
11270 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
11280 2a 20 20 20 28 32 29 20 20 58 20 75 73 65 73 20  *   (2)  X uses 
11290 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
112a0 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a  se terms than Y.
112b0 2a 2a 20 20 20 28 33 29 20 20 45 76 65 72 79 20  **   (3)  Every 
112c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
112d0 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
112e0 6c 73 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a  lso used by Y.**
112f0 20 20 20 28 34 29 20 20 58 20 73 6b 69 70 73 20     (4)  X skips 
11300 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
11310 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a   columns as Y.**
11320 20 20 20 28 35 29 20 20 49 66 20 58 20 69 73 20     (5)  If X is 
11330 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
11340 2c 20 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a  , than Y is too.
11350 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73  **.** Conditions
11360 20 28 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61   (2) and (3) mea
11370 6e 20 74 68 61 74 20 58 20 69 73 20 61 20 22 70  n that X is a "p
11380 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 6f 66  roper subset" of
11390 20 59 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61   Y..** If X is a
113a0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
113b0 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20  f Y then Y is a 
113c0 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e  better choice an
113d0 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61  d ought.** to ha
113e0 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e  ve a lower cost.
113f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
11400 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e  eturns TRUE when
11410 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72   that cost .** r
11420 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69  elationship is i
11430 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64  nverted and need
11440 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  s to be adjusted
11450 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34  .  Constraint (4
11460 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62  ).** was added b
11470 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65 73  ecause if X uses
11480 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20   skip-scan less 
11490 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20  than Y it still 
114a0 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65  might.** deserve
114b0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76   a lower cost ev
114c0 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72  en if it is a pr
114d0 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
114e0 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35  .  Constraint (5
114f0 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62  ).** was added b
11500 65 63 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e  ecause a coverin
11510 67 20 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79  g index probably
11520 20 64 65 73 65 72 76 65 73 20 74 6f 20 68 61 76   deserves to hav
11530 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a  e a lower cost.*
11540 2a 20 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76  * than a non-cov
11550 65 72 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e  ering index even
11560 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
11570 65 72 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74  er subset..*/.st
11580 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
11590 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
115a0 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
115b0 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
115c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
115d0 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
115e0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
115f0 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
11600 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
11610 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
11620 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
11630 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
11640 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
11650 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
11660 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
11670 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
11680 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
11690 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
116a0 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
116b0 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
116c0 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
116d0 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
116e0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
116f0 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) 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 20 20 69 66 28 20 70 58   Y */.    if( pX
11730 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
11740 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
11750 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
11760 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
11770 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
11780 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
11790 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
117a0 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
117b0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
117c0 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
117d0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
117e0 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
117f0 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
11800 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
11810 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
11820 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
11830 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
11840 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
11850 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
11860 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e  .  }.  if( (pX->
11870 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44  wsFlags&WHERE_ID
11880 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26  X_ONLY)!=0 .   &
11890 26 20 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57  & (pY->wsFlags&W
118a0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
118b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
118c0 30 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e  0;  /* Constrain
118d0 74 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72  t (5) */.  }.  r
118e0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
118f0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
11900 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
11910 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
11920 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
11930 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
11940 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
11950 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
11960 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
11970 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
11980 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
11990 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
119a0 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
119b0 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
119c0 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
119d0 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
119e0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
119f0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
11a00 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
11a10 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
11a20 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
11a30 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
11a40 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
11a50 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
11a60 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
11a70 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
11a80 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11a90 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
11aa0 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
11ab0 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
11ac0 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
11ad0 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
11ae0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
11af0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
11b00 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
11b10 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
11b20 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
11b30 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
11b40 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
11b50 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
11b60 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
11b70 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
11b80 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
11b90 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
11ba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
11bb0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
11bc0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
11bd0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11be0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
11bf0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
11c00 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
11c10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
11c20 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
11c30 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
11c40 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
11c50 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
11c60 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
11c70 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
11c80 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
11c90 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
11ca0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
11cb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11cc0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
11cd0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
11ce0 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
11cf0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
11d00 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
11d10 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
11d20 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
11d30 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
11d40 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
11d50 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
11d60 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
11d70 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
11d80 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
11d90 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
11da0 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
11db0 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
11dc0 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
11dd0 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
11de0 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
11df0 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
11e00 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
11e10 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
11e20 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
11e30 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11e60 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
11e70 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
11e80 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
11e90 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11ea0 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
11eb0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
11ec0 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
11ed0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
11ee0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
11ef0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
11f00 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
11f10 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
11f20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72  that can be.** r
11f30 65 70 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70  eplaced by pTemp
11f40 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  late..**.** Retu
11f50 72 6e 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70  rn NULL if pTemp
11f60 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
11f70 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72  long on the Wher
11f80 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49  eLoop list..** I
11f90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
11fa0 20 70 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74   pTemplate ought
11fb0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66   to be dropped f
11fc0 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73  rom further cons
11fd0 69 64 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ideration..**.**
11fe0 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
11ff0 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
12000 6c 61 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65  late can replace
12010 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
12020 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70  e.** link that p
12030 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a  oints to pX..**.
12040 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20  ** If pTemplate 
12050 63 61 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61  cannot replace a
12060 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d  ny existing elem
12070 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  ent of the list 
12080 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20  but needs.** to 
12090 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
120a0 6c 69 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e  list as a new en
120b0 74 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  try, then return
120c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
120d0 65 0a 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65  e.** tail of the
120e0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
120f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
12100 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
12110 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
12120 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
12130 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
12140 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
12150 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
12160 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
12170 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
12180 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
12190 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
121a0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
121b0 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
121c0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
121d0 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
121e0 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
121f0 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
12200 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
12210 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
12220 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
12230 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
12240 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
12250 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
12260 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
12270 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
12280 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
12290 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
122a0 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
122b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
122c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
122d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
122e0 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
122f0 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
12300 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
12310 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
12320 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
12330 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
12340 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
12350 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
12360 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
12370 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
12380 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
12390 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
123a0 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
123b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
123c0 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
123d0 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
123e0 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
123f0 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
12400 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
12410 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
12420 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
12430 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
12440 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
12450 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
12460 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
12470 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
12480 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
12490 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
124a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
124b0 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
124c0 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
124d0 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
124e0 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
124f0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
12500 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
12510 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
12520 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
12530 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
12540 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
12550 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
12560 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
12570 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
12580 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
12590 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
125a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
125b0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
125c0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
125d0 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
125e0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
125f0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
12600 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
12610 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
12620 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
12630 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
12640 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
12650 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
12660 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
12670 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
12680 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
12690 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
126a0 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
126b0 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
126c0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
126d0 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
126e0 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
126f0 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
12700 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
12710 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
12720 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
12730 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
12740 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
12750 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
12760 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
12770 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
12780 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
12790 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
127a0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
127b0 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
127c0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
127d0 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
127e0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
127f0 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
12800 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
12810 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
12820 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
12850 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
12860 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
12890 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
128a0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
128b0 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
128c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
128d0 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
128e0 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
128f0 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
12900 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
12910 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
12920 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
12930 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
12940 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
12950 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
12960 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
12970 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
12980 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
12990 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
129a0 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
129b0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
129c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
129d0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
129e0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
129f0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
12a00 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
12a10 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
12a20 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
12a30 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a50 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
12a60 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
12a70 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
12aa0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
12ab0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
12ac0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
12ad0 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
12ae0 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
12af0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
12b00 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
12b10 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
12b20 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
12b30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12b40 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
12b50 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
12b60 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
12b70 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
12b80 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
12b90 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
12ba0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
12bb0 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
12bc0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
12bd0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
12be0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
12bf0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
12c00 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
12c10 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
12c20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
12c30 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
12c40 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
12c50 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
12c60 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
12c70 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
12c80 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
12c90 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
12ca0 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
12cb0 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
12cc0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
12cd0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
12ce0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
12cf0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
12d00 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
12d10 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
12d20 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
12d30 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
12d40 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
12d50 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
12d60 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
12d70 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
12d80 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
12d90 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
12da0 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
12db0 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
12dc0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
12dd0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
12de0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
12df0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
12e00 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
12e10 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
12e20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
12e30 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
12e40 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
12e50 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
12e60 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
12e70 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
12e80 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
12e90 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
12ea0 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
12eb0 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
12ec0 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
12ed0 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
12ee0 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
12ef0 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
12f00 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
12f10 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
12f20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
12f30 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
12f40 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
12f50 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
12f60 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
12f70 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
12f80 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
12f90 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
12fa0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
12fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
12fc0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
12fd0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
12fe0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
12ff0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
13000 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
13010 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
13020 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
13030 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
13040 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
13050 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
13060 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  e->db;.  int rc;
13070 0a 0a 20 20 2f 2a 20 53 74 6f 70 20 74 68 65 20  ..  /* Stop the 
13080 73 65 61 72 63 68 20 6f 6e 63 65 20 77 65 20 68  search once we h
13090 69 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  it the query pla
130a0 6e 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69  nner search limi
130b0 74 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  t */.  if( pBuil
130c0 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 3d  der->iPlanLimit=
130d0 3d 30 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  =0 ){.    WHERET
130e0 52 41 43 45 28 30 78 66 66 66 66 66 66 66 66 2c  RACE(0xffffffff,
130f0 28 22 3d 3d 3d 20 71 75 65 72 79 20 70 6c 61 6e  ("=== query plan
13100 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74  ner search limit
13110 20 72 65 61 63 68 65 64 20 3d 3d 3d 5c 6e 22 29   reached ===\n")
13120 29 3b 0a 20 20 20 20 69 66 28 20 70 42 75 69 6c  );.    if( pBuil
13130 64 65 72 2d 3e 70 4f 72 53 65 74 20 29 20 70 42  der->pOrSet ) pB
13140 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
13150 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
13160 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
13170 20 7d 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 69   }.  pBuilder->i
13180 50 6c 61 6e 4c 69 6d 69 74 2d 2d 3b 0a 0a 20 20  PlanLimit--;..  
13190 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
131a0 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
131b0 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
131c0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
131d0 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
131e0 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
131f0 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
13200 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  et!=0 ){.    if(
13210 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65   pTemplate->nLTe
13220 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  rm ){.#if WHERET
13230 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
13240 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c     u16 n = pBuil
13250 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a  der->pOrSet->n;.
13260 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65        int x =.#e
13270 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65  ndif.      where
13280 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  OrInsert(pBuilde
13290 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70  r->pOrSet, pTemp
132a0 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54  late->prereq, pT
132b0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20  emplate->rRun,. 
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
132f0 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52  ut);.#if WHERETR
13300 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
13310 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
13320 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
13330 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
13340 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
13350 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
13360 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
13370 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   ", n);.        
13380 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
13390 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
133a0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
133b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
133c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
133d0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  _OK;.  }..  /* L
133e0 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
133f0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  ing WhereLoop to
13400 20 72 65 70 6c 61 63 65 20 77 69 74 68 20 70 54   replace with pT
13410 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77  emplate.  */.  w
13420 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
13430 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  st(pWInfo->pLoop
13440 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  s, pTemplate);. 
13450 20 70 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c   ppPrev = whereL
13460 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70  oopFindLesser(&p
13470 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
13480 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66  Template);..  if
13490 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20  ( ppPrev==0 ){. 
134a0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65     /* There alre
134b0 61 64 79 20 65 78 69 73 74 73 20 61 20 57 68 65  ady exists a Whe
134c0 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69  reLoop on the li
134d0 73 74 20 74 68 61 74 20 69 73 20 62 65 74 74 65  st that is bette
134e0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54  r.    ** than pT
134f0 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74  emplate, so just
13500 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74   ignore pTemplat
13510 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52  e */.#if WHERETR
13520 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
13530 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  x8 */.    if( sq
13540 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13550 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73  & 0x8 ){.      s
13560 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
13570 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a  f("   skip: ");.
13580 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
13590 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
135a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
135b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
135c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
135d0 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  K;  .  }else{.  
135e0 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20    p = *ppPrev;. 
135f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
13600 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
13610 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
13620 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
13630 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
13640 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
13650 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
13660 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
13670 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
13680 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
13690 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
136a0 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45  it..  */.#if WHE
136b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
136c0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
136d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
136e0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69  e & 0x8 ){.    i
136f0 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( p!=0 ){.     
13700 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
13710 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29  ntf("replace: ")
13720 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
13730 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64  pPrint(p, pBuild
13740 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
13750 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
13760 74 66 28 22 20 20 20 77 69 74 68 3a 20 22 29 3b  tf("   with: ");
13770 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13780 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
13790 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a 20 22  intf("    add: "
137a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65  );.    }.    whe
137b0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
137c0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
137d0 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
137e0 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  f.  if( p==0 ){.
137f0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
13800 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
13810 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e  to add to the en
13820 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f  d of the list */
13830 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70  .    *ppPrev = p
13840 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
13850 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
13860 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
13870 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
13880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13890 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77 68 65  EM_BKPT;.    whe
138a0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
138b0 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
138c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
138d0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
138e0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
138f0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
13900 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
13910 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
13920 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
13930 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
13940 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
13950 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
13960 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
13970 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
13980 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
13990 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
139a0 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
139b0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
139c0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
139d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
139e0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
139f0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
13a00 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
13a10 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
13a20 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
13a30 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13a40 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
13a50 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
13a60 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
13a70 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
13a80 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
13a90 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
13aa0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
13ab0 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
13ac0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
13ad0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
13ae0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
13af0 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
13b00 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
13b10 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
13b20 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
13b30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13b40 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
13b50 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
13b60 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
13b70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66  rc = whereLoopXf
13b80 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
13b90 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ate);.  if( (p->
13ba0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13bb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
13bc0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
13bd0 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
13be0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
13bf0 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
13c00 64 65 78 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51  dex->idxType==SQ
13c10 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b  LITE_IDXTYPE_IPK
13c20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
13c30 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
13c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13c60 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72   Adjust the Wher
13c70 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65  eLoop.nOut value
13c80 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63   downward to acc
13c90 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f  ount for terms o
13ca0 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  f the.** WHERE c
13cb0 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
13cc0 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75  ence the loop bu
13cd0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
13ce0 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e  used by an.** in
13cf0 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76  dex..*.** For ev
13d00 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
13d10 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f   term that is no
13d20 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  t used by the in
13d30 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68  dex.** and which
13d40 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f   has a truth pro
13d50 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65  bability assigne
13d60 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  d by one of the 
13d70 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a  likelihood(),.**
13d80 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e   likely(), or un
13d90 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e  likely() SQL fun
13da0 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74  ctions, reduce t
13db0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
13dc0 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74  ber.** of output
13dd0 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f   rows by the pro
13de0 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69  bability specifi
13df0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47  ed..**.** TUNING
13e00 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  :  For every WHE
13e10 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
13e20 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
13e30 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
13e40 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e  and which does n
13e50 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  ot have an assig
13e60 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62  ned truth probab
13e70 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63  ility, heuristic
13e80 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62  s.** described b
13e90 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f  elow are used to
13ea0 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
13eb0 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
13ec0 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20  bility..** TODO 
13ed0 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73  --> Perhaps this
13ee0 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
13ef0 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72  at could be impr
13f00 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a  oved by better.*
13f10 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69  * table statisti
13f20 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  cs..**.** Heuris
13f30 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65  tic 1:  Estimate
13f40 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
13f50 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25  bility as 93.75%
13f60 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a  .  The 93.75%.**
13f70 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e   value correspon
13f80 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45  ds to -1 in LogE
13f90 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20  st notation, so 
13fa0 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65  this means decre
13fb0 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72  ment.** the Wher
13fc0 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64  eLoop.nOut field
13fd0 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20   for every such 
13fe0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
13ff0 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  m..**.** Heurist
14000 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20  ic 2:  If there 
14010 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f  exists one or mo
14020 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
14030 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
14040 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61  form "x==EXPR" a
14050 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61  nd EXPR is not a
14060 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31   constant 0 or 1
14070 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
14080 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75   the.** final ou
14090 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
140a0 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20  e is no greater 
140b0 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20  than 1/4 of the 
140c0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20  total number.** 
140d0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
140e0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
140f0 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68  words, assume th
14100 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20  at x==EXPR will 
14110 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74  filter.** out at
14120 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20   least 3 out of 
14130 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52  4 rows.  If EXPR
14140 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31   is -1 or 0 or 1
14150 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65  , then maybe the
14160 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69  .** "x" column i
14170 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73  s boolean or els
14180 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69  e -1 or 0 or 1 i
14190 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75  s a common defau
141a0 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74  lt value.** on t
141b0 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e  he "x" column an
141c0 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  d so in that cas
141d0 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f  e only cap the o
141e0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
141f0 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73  te.** at 1/2 ins
14200 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a  tead of 1/4..*/.
14210 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
14220 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
14230 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
14240 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54   *pWC,      /* T
14250 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14260 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
14270 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54  pLoop,      /* T
14280 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73  he loop to adjus
14290 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20  t downward */.  
142a0 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20  LogEst nRow     
142b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
142c0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
142d0 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a  entire table */.
142e0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
142f0 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69  pTerm, *pX;.  Bi
14300 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64  tmask notAllowed
14310 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72   = ~(pLoop->prer
14320 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  eq|pLoop->maskSe
14330 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  lf);.  int i, j,
14340 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65   k;.  LogEst iRe
14350 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  duce = 0;    /* 
14360 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75  pLoop->nOut shou
14370 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52  ld not exceed nR
14380 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20  ow-iReduce */.. 
14390 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
143a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
143b0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
143c0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  );.  for(i=pWC->
143d0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
143e0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
143f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
14400 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
14410 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
14420 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
14430 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
14440 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
14450 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
14460 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14470 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
14480 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
14490 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
144a0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
144b0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
144c0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
144d0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
144e0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
144f0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
14500 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
14510 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
14520 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
14530 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
14540 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
14550 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
14560 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
14570 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
14580 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
14590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
145a0 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62   If a truth prob
145b0 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69  ability is speci
145c0 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c  fied using the l
145d0 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74  ikelihood() hint
145e0 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  s,.        ** th
145f0 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61  en use the proba
14600 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20  bility provided 
14610 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
14620 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
14630 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  Loop->nOut += pT
14640 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
14650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14660 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61       /* In the a
14670 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63  bsence of explic
14680 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  it truth probabi
14690 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72  lities, use heur
146a0 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20  istics to.      
146b0 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61    ** guess a rea
146c0 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72  sonable truth pr
146d0 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20  obability. */.  
146e0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
146f0 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t--;.        if(
14700 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14710 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  r&(WO_EQ|WO_IS) 
14720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
14730 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
14740 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
14750 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14760 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
14770 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
14780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
14790 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
147a0 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20  ger(pRight, &k) 
147b0 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c  && k>=(-1) && k<
147c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
147d0 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    k = 10;.      
147e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
147f0 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20         k = 20;. 
14800 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14810 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65       if( iReduce
14820 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b  <k ) iReduce = k
14830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14850 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  if( pLoop->nOut 
14860 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29  > nRow-iReduce )
14870 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
14880 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a  nRow - iReduce;.
14890 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70  }../* .** Term p
148a0 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72  Term is a vector
148b0 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
148c0 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  n operation. The
148d0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
148e0 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74  n.** in the vect
148f0 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  or can be optimi
14900 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  zed using column
14910 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65   nEq of the inde
14920 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  x. This.** funct
14930 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
14940 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
14950 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20  vector elements 
14960 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
14970 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74  .** as part of t
14980 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69  he range compari
14990 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  son..**.** For e
149a0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
149b0 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
149c0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
149d0 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c   (b, c, d) > (?,
149e0 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64   ?, ?).**.** and
149f0 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a   the index:.**.*
14a00 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
14a10 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63   ... ON (a, b, c
14a20 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68  , d, e).**.** th
14a30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14a40 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65   would be invoke
14a50 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68  d with nEq=1. Th
14a60 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
14a70 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65   in.** this case
14a80 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   is 3..*/.static
14a90 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56   int whereRangeV
14aa0 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73  ectorLen(.  Pars
14ab0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14ac0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
14ad0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ext */.  int iCu
14ae0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
14af0 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
14b00 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
14b10 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f  *pIdx,         /
14b20 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
14b30 65 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65  e used for a ine
14b40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
14b50 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  nt */.  int nEq,
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b70 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20  Number of prior 
14b80 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
14b90 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64  ints on same ind
14ba0 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
14bb0 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20  m *pTerm     /* 
14bc0 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75  The vector inequ
14bd0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
14be0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
14bf0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  p = sqlite3ExprV
14c00 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d  ectorSize(pTerm-
14c10 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
14c20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70    int i;..  nCmp
14c30 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49   = MIN(nCmp, (pI
14c40 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45  dx->nColumn - nE
14c50 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  q));.  for(i=1; 
14c60 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmp; i++){.  
14c70 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d    /* Test if com
14c80 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65  parison i of pTe
14c90 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  rm is compatible
14ca0 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b   with column (i+
14cb0 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20  nEq) .    ** of 
14cc0 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f  the index. If no
14cd0 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70  t, exit the loop
14ce0 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61  .  */.    char a
14cf0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
14d00 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
14d10 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a  rison affinity *
14d20 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61 66  /.    char idxaf
14d30 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
14d40 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63      /* Indexed c
14d50 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
14d60 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
14d70 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
14d80 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
14d90 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  on collation seq
14da0 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70  uence */.    Exp
14db0 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d  r *pLhs = pTerm-
14dc0 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78  >pExpr->pLeft->x
14dd0 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
14de0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  pr;.    Expr *pR
14df0 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  hs = pTerm->pExp
14e00 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
14e10 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
14e20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
14e30 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52  .      pRhs = pR
14e40 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  hs->x.pSelect->p
14e50 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14e60 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
14e70 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d      pRhs = pRhs-
14e80 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
14e90 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Expr;.    }..   
14ea0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
14eb0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f  he LHS of the co
14ec0 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14ed0 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74  lumn reference t
14ee0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  o.    ** the rig
14ef0 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ht column of the
14f00 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74 61   right source ta
14f10 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ble. And that th
14f20 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72  e sort.    ** or
14f30 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  der of the index
14f40 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73   column is the s
14f50 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74 20  ame as the sort 
14f60 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20  order of the.   
14f70 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64   ** leftmost ind
14f80 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  ex column.  */. 
14f90 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21     if( pLhs->op!
14fa0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20  =TK_COLUMN .    
14fb0 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65   || pLhs->iTable
14fc0 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20  !=iCur .     || 
14fd0 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  pLhs->iColumn!=p
14fe0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b  Idx->aiColumn[i+
14ff0 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49  nEq] .     || pI
15000 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
15010 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f  +nEq]!=pIdx->aSo
15020 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20  rtOrder[nEq].   
15030 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
15040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
15050 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c  case( pLhs->iCol
15060 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b  umn==XN_ROWID );
15070 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
15080 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
15090 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45  y(pRhs, sqlite3E
150a0 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73  xprAffinity(pLhs
150b0 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d  ));.    idxaff =
150c0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
150d0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78  umnAffinity(pIdx
150e0 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e  ->pTable, pLhs->
150f0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66  iColumn);.    if
15100 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29 20  ( aff!=idxaff ) 
15110 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c  break;..    pCol
15120 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
15130 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
15140 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
15150 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  hs);.    if( pCo
15160 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ll==0 ) break;. 
15170 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15180 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
15190 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
151a0 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b  [i+nEq]) ) break
151b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
151c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
151d0 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20  t the cost C by 
151e0 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63  the costMult fac
151f0 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c  ter T.  This onl
15200 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63  y occurs if.** c
15210 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53  ompiled with -DS
15220 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
15230 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20  TMULT.*/.#ifdef 
15240 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
15250 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20  STMULT.# define 
15260 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
15270 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54  ier(C,T)  C += T
15280 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15290 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
152a0 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a  ier(C,T).#endif.
152b0 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
152c0 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
152d0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
152e0 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
152f0 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  of the .** index
15300 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20   pIndex. Try to 
15310 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
15320 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
15330 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15340 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  ed, pBuilder->pN
15350 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e  ew->nOut contain
15360 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72  s the .** number
15370 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
15380 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
15390 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69  by filtering usi
153a0 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74  ng the nEq .** t
153b0 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74  erms only. If it
153c0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68   is modified, th
153d0 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74  is value is rest
153e0 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  ored before this
153f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
15400 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  turns..**.** If 
15410 70 50 72 6f 62 65 2d 3e 69 64 78 54 79 70 65 3d  pProbe->idxType=
15420 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
15430 49 50 4b 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  IPK, that means 
15440 70 49 6e 64 65 78 20 69 73 20 0a 2a 2a 20 61 20  pIndex is .** a 
15450 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
15460 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20  for the INTEGER 
15470 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a  PRIMARY KEY..*/.
15480 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
15490 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
154a0 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  x(.  WhereLoopBu
154b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
154c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
154d0 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f  eLoop factory */
154e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
154f0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
15500 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
15510 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
15520 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
15530 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20   *pProbe,       
15540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15550 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a   index on pSrc *
15560 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75  /.  LogEst nInMu
15570 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
15580 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65      /* log(Numbe
15590 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
155a0 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b  due to IN) */.){
155b0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
155c0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
155d0 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45  >pWInfo;  /* WHE
155e0 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65  RE analyse conte
155f0 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
15600 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
15610 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f  pParse;        /
15620 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15630 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
15640 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15650 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
15660 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  se connection ma
15670 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lloc context */.
15680 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
15690 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
156a0 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
156b0 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f  ereLoop under co
156c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
156d0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
156e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
156f0 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75  /* A WhereTerm u
15700 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  nder considerati
15710 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61  on */.  int opMa
15720 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
15730 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64          /* Valid
15740 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63   operators for c
15750 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
15760 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20  WhereScan scan; 
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
15790 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20  WHERE terms */. 
157a0 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70   Bitmask saved_p
157b0 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20  rereq;          
157c0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
157d0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72  ue of pNew->prer
157e0 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  eq */.  u16 save
157f0 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  d_nLTerm;       
15800 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15810 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15820 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75  w->nLTerm */.  u
15830 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20  16 saved_nEq;   
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15850 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
15860 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
15870 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73  e.nEq */.  u16 s
15880 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20  aved_nBtm;      
15890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
158a0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
158b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
158c0 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  tm */.  u16 save
158d0 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20 20 20  d_nTop;         
158e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
158f0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15900 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
15910 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
15920 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
15930 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
15940 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
15950 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
15960 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
15970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
15980 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
15990 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
159a0 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
159b0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
159c0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
159d0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
159e0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ut */.  int rc =
159f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15a00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15a10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
15a20 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
15a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15a40 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
15a50 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
15a60 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
15a90 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
15aa0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
15ab0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
15ac0 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
15ad0 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
15ae0 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
15af0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
15b00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15b10 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
15b20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15b30 50 54 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  PT;.  WHERETRACE
15b40 28 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20  (0x800, ("BEGIN 
15b50 25 73 2e 61 64 64 42 74 72 65 65 49 64 78 28 25  %s.addBtreeIdx(%
15b60 73 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  s), nEq=%d\n",. 
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62      pProbe->pTab
15b90 6c 65 2d 3e 7a 4e 61 6d 65 2c 70 50 72 6f 62 65  le->zName,pProbe
15ba0 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75  ->zName, pNew->u
15bb0 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20  .btree.nEq));.. 
15bc0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
15bd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15be0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
15bf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (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 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
15c20 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
15c30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15c40 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
15c50 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
15c60 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
15c70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
15c80 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
15c90 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73  ==0 );.    opMas
15ca0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
15cb0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
15cc0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c  T|WO_LE|WO_ISNUL
15cd0 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69  L|WO_IS;.  }.  i
15ce0 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
15cf0 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
15d00 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
15d10 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
15d20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
15d30 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
15d40 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  e->nColumn );.. 
15d50 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
15d60 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
15d70 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70    saved_nBtm = p
15d80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
15d90 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70 20  m;.  saved_nTop 
15da0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
15db0 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53  nTop;.  saved_nS
15dc0 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69  kip = pNew->nSki
15dd0 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
15de0 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
15df0 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
15e00 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
15e10 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
15e20 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
15e30 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
15e40 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
15e50 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
15e60 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
15e70 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
15e80 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f  >iCursor, saved_
15e90 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nEq,.           
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
15eb0 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
15ec0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
15ed0 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f  ;.  rSize = pPro
15ee0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15ef0 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  0];.  rLogSize =
15f00 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
15f10 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
15f20 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
15f30 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
15f40 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
15f50 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20  {.    u16 eOp = 
15f60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15f70 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64  ;   /* Shorthand
15f80 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65   for pTerm->eOpe
15f90 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67  rator */.    Log
15fa0 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20  Est rCostIdx;.  
15fb0 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61    LogEst nOutUna
15fc0 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20  djusted;        
15fd0 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49  /* nOut before I
15fe0 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64  N() and WHERE ad
15ff0 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  justments */.   
16000 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69   int nIn = 0;.#i
16010 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16020 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
16030 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  4.    int nRecVa
16040 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
16050 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
16060 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d  f.    if( (eOp==
16070 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
16080 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
16090 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
160a0 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e    && indexColumn
160b0 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20  NotNull(pProbe, 
160c0 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29  saved_nEq).    )
160d0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
160e0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
160f0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
16100 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
16110 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
16120 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
16130 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
16140 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
16150 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
16160 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
16170 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
16180 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69  of a LIKE optimi
16190 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e  zation range con
161a0 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74  straint.    ** t
161b0 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77  o mix with a low
161c0 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66  er range bound f
161d0 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73  rom some other s
161e0 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  ource */.    if(
161f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
16200 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26  & TERM_LIKEOPT &
16210 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
16220 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74  or==WO_LT ) cont
16230 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
16240 20 6e 6f 74 20 61 6c 6c 6f 77 20 63 6f 6e 73 74   not allow const
16250 72 61 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  raints from the 
16260 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
16270 62 65 20 75 73 65 64 20 62 79 20 74 68 65 0a 20  be used by the. 
16280 20 20 20 2a 2a 20 72 69 67 68 74 20 74 61 62 6c     ** right tabl
16290 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
162a0 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69  .  Only constrai
162b0 6e 74 73 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  nts in the ON cl
162c0 61 75 73 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  ause are.    ** 
162d0 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69  allowed */.    i
162e0 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69  f( (pSrc->fg.joi
162f0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
16300 21 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  !=0.     && !Exp
16310 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
16320 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
16330 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20  omJoin).    ){. 
16340 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
16350 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49 73     }..    if( Is
16360 55 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f  UniqueIndex(pPro
16370 62 65 29 20 26 26 20 73 61 76 65 64 5f 6e 45 71  be) && saved_nEq
16380 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  ==pProbe->nKeyCo
16390 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 42 75  l-1 ){.      pBu
163a0 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20  ilder->bldFlags 
163b0 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55  |= SQLITE_BLDF_U
163c0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
163d0 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
163e0 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
163f0 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45  LITE_BLDF_INDEXE
16400 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  D;.    }.    pNe
16410 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
16420 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
16430 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
16440 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
16450 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16460 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
16470 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  tm;.    pNew->u.
16480 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76  btree.nTop = sav
16490 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65  ed_nTop;.    pNe
164a0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
164b0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
164c0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
164d0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
164e0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
164f0 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
16500 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
16510 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
16520 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
16530 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
16540 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
16550 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
16560 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
16570 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
16580 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
16590 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
165a0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
165b0 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
165c0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
165d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
165e0 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
165f0 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
16600 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16610 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
16620 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
16630 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
16640 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
16650 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
16660 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
16670 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16680 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16690 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
166a0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
166b0 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
166c0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
166d0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
166e0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 6e  int i;.        n
166f0 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  In = 46;  assert
16700 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
16710 45 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20 20  Est(25) );..    
16720 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
16730 73 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c  ssion may actual
16740 6c 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ly be of the for
16750 6d 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45 4c  m (x, y) IN (SEL
16760 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20  ECT...)..       
16770 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
16780 20 74 68 65 72 65 20 69 73 20 61 20 73 65 70 61   there is a sepa
16790 72 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65 61  rate term for ea
167a0 63 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28 79  ch of (x) and (y
167b0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  )..        ** Ho
167c0 77 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d  wever, the nIn m
167d0 75 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c 64  ultiplier should
167e0 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65 64   only be applied
167f0 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a   once, not once.
16800 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 65          ** for e
16810 61 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20 54  ach such term. T
16820 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
16830 70 20 63 68 65 63 6b 73 20 74 68 61 74 20 70 54  p checks that pT
16840 65 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20 20  erm is the.     
16850 20 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63 68     ** first such
16860 20 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e   term in use, an
16870 64 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b 20  d sets nIn back 
16880 74 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  to 0 if it is no
16890 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  t. */.        fo
168a0 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e  r(i=0; i<pNew->n
168b0 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20  LTerm-1; i++){. 
168c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
168d0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20  w->aLTerm[i] && 
168e0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  pNew->aLTerm[i]-
168f0 3e 70 45 78 70 72 3d 3d 70 45 78 70 72 20 29 20  >pExpr==pExpr ) 
16900 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nIn = 0;.       
16910 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
16920 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
16930 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
16940 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
16950 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
16960 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
16970 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
16980 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
16990 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
169a0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
169b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
169c0 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20  t( nIn>0 );  /* 
169d0 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32  RHS always has 2
169e0 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e   or more terms..
169f0 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20  .  The parser.  
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67          ** chang
16a20 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e  es "x IN (?)" in
16a30 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20  to "x=?". */.   
16a40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16a50 50 72 6f 62 65 2d 3e 68 61 73 53 74 61 74 31 20  Probe->hasStat1 
16a60 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
16a70 74 20 4d 2c 20 6c 6f 67 4b 2c 20 73 61 66 65 74  t M, logK, safet
16a80 79 4d 61 72 67 69 6e 3b 0a 20 20 20 20 20 20 20  yMargin;.       
16a90 20 2f 2a 20 4c 65 74 3a 0a 20 20 20 20 20 20 20   /* Let:.       
16aa0 20 2a 2a 20 20 20 4e 20 3d 20 74 68 65 20 74 6f   **   N = the to
16ab0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
16ac0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  ws in the table.
16ad0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4b 20 3d          **   K =
16ae0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
16af0 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 52 48  ntries on the RH
16b00 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16b10 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ator.        ** 
16b20 20 20 4d 20 3d 20 74 68 65 20 6e 75 6d 62 65 72    M = the number
16b30 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
16b40 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
16b50 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 0a 20   terms to the . 
16b60 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
16b70 74 6f 20 74 68 65 20 6c 65 66 74 20 69 6e 20 74  to the left in t
16b80 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20  he same index.  
16b90 49 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  If the IN operat
16ba0 6f 72 20 69 73 20 6f 6e 0a 20 20 20 20 20 20 20  or is on.       
16bb0 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 6c 65   **       the le
16bc0 66 74 2d 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f  ft-most index co
16bd0 6c 75 6d 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20  lumn, M==N..    
16be0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16bf0 2a 20 47 69 76 65 6e 20 74 68 65 20 64 65 66 69  * Given the defi
16c00 6e 69 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20 69  nitions above, i
16c10 74 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 6f  t is better to o
16c20 6d 69 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  mit the IN opera
16c30 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  tor.        ** f
16c40 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 6c 6f  rom the index lo
16c50 6f 6b 75 70 20 61 6e 64 20 69 6e 73 74 65 61 64  okup and instead
16c60 20 64 6f 20 61 20 73 63 61 6e 20 6f 66 20 74 68   do a scan of th
16c70 65 20 4d 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20  e M elements,.  
16c80 20 20 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67        ** testing
16c90 20 65 61 63 68 20 73 63 61 6e 6e 65 64 20 72 6f   each scanned ro
16ca0 77 20 61 67 61 69 6e 73 74 20 74 68 65 20 49 4e  w against the IN
16cb0 20 6f 70 65 72 61 74 6f 72 20 73 65 70 61 72 61   operator separa
16cc0 74 65 6c 79 2c 20 69 66 3a 0a 20 20 20 20 20 20  tely, if:.      
16cd0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16ce0 20 20 20 20 20 20 20 4d 2a 6c 6f 67 28 4b 29 20         M*log(K) 
16cf0 3c 20 4b 2a 6c 6f 67 28 4e 29 0a 20 20 20 20 20  < K*log(N).     
16d00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16d10 20 4f 75 72 20 65 73 74 69 6d 61 74 65 73 20 66   Our estimates f
16d20 6f 72 20 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d  or M, K, and N m
16d30 69 67 68 74 20 62 65 20 69 6e 61 63 63 75 72 61  ight be inaccura
16d40 74 65 2c 20 73 6f 20 77 65 20 62 75 69 6c 64 20  te, so we build 
16d50 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
16d60 73 61 66 65 74 79 20 6d 61 72 67 69 6e 20 6f 66  safety margin of
16d70 20 32 20 28 4c 6f 67 45 73 74 3a 20 31 30 29 20   2 (LogEst: 10) 
16d80 74 68 61 74 20 66 61 76 6f 72 73 20 75 73 69 6e  that favors usin
16d90 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
16da0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  r.        ** wit
16db0 68 20 74 68 65 20 69 6e 64 65 78 2c 20 61 73 20  h the index, as 
16dc0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 68  using an index h
16dd0 61 73 20 62 65 74 74 65 72 20 77 6f 72 73 74 2d  as better worst-
16de0 63 61 73 65 20 62 65 68 61 76 69 6f 72 2e 0a 20  case behavior.. 
16df0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
16e00 64 6f 20 6e 6f 74 20 68 61 76 65 20 72 65 61 6c  do not have real
16e10 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61   sqlite_stat1 da
16e20 74 61 2c 20 61 6c 77 61 79 73 20 70 72 65 66 65  ta, always prefe
16e30 72 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 20  r to use.       
16e40 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
16e50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16e60 20 20 4d 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69    M = pProbe->ai
16e70 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
16e80 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 6c 6f  nEq];.        lo
16e90 67 4b 20 3d 20 65 73 74 4c 6f 67 28 6e 49 6e 29  gK = estLog(nIn)
16ea0 3b 0a 20 20 20 20 20 20 20 20 73 61 66 65 74 79  ;.        safety
16eb0 4d 61 72 67 69 6e 20 3d 20 31 30 3b 20 20 2f 2a  Margin = 10;  /*
16ec0 20 54 55 4e 49 4e 47 3a 20 65 78 74 72 61 20 77   TUNING: extra w
16ed0 65 69 67 68 74 20 66 6f 72 20 69 6e 64 65 78 65  eight for indexe
16ee0 64 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  d IN */.        
16ef0 69 66 28 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73  if( M + logK + s
16f00 61 66 65 74 79 4d 61 72 67 69 6e 20 3c 20 6e 49  afetyMargin < nI
16f10 6e 20 2b 20 72 4c 6f 67 53 69 7a 65 20 29 7b 0a  n + rLogSize ){.
16f20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
16f30 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20  RACE(0x40,.     
16f40 20 20 20 20 20 20 20 28 22 53 63 61 6e 20 70 72         ("Scan pr
16f50 65 66 65 72 72 65 64 20 6f 76 65 72 20 49 4e 20  eferred over IN 
16f60 6f 70 65 72 61 74 6f 72 20 6f 6e 20 63 6f 6c 75  operator on colu
16f70 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22 20  mn %d of \"%s\" 
16f80 28 25 64 3c 25 64 29 5c 6e 22 2c 0a 20 20 20 20  (%d<%d)\n",.    
16f90 20 20 20 20 20 20 20 20 20 73 61 76 65 64 5f 6e           saved_n
16fa0 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  Eq, pProbe->zNam
16fb0 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49  e, M+logK+10, nI
16fc0 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20  n+rLogSize));.  
16fd0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
16fe0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16ff0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
17000 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20  TRACE(0x40,.    
17010 20 20 20 20 20 20 20 20 28 22 49 4e 20 6f 70 65          ("IN ope
17020 72 61 74 6f 72 20 70 72 65 66 65 72 72 65 64 20  rator preferred 
17030 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20  on column %d of 
17040 5c 22 25 73 5c 22 20 28 25 64 3e 3d 25 64 29 5c  \"%s\" (%d>=%d)\
17050 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17060 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f   saved_nEq, pPro
17070 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67  be->zName, M+log
17080 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69  K+10, nIn+rLogSi
17090 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ze));.        }.
170a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
170b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
170c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
170d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
170e0 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
170f0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
17100 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
17110 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
17120 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
17130 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
17140 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
17150 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
17160 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
17170 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
17180 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
17190 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
171a0 6f 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d  ol>=0 && nInMul=
171b0 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  =0 && saved_nEq=
171c0 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
171d0 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
171e0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58       if( iCol==X
171f0 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62  N_ROWID || pProb
17200 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a  e->uniqNotNull .
17210 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72           || (pPr
17220 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  obe->nKeyCol==1 
17230 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
17240 6f 72 20 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51  or && eOp==WO_EQ
17250 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
17260 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
17270 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
17280 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  NEROW;.        }
17290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
172a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
172b0 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45   WHERE_UNQ_WANTE
172c0 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
172d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
172e0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
172f0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
17300 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
17310 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
17320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
17330 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
17340 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
17350 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
17360 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17370 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
17380 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
17390 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
173a0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
173b0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
173c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
173d0 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61  e.nBtm = whereRa
173e0 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
173f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
17400 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
17410 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
17420 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b  , pTerm.      );
17430 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
17440 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
17450 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
17460 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
17470 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
17480 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
17490 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
174a0 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
174b0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
174c0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
174d0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
174e0 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
174f0 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
17500 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
17510 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
17520 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
17530 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
17540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17550 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
17560 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
17570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17580 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
17590 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
175a0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
175b0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
175c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
175d0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
175e0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
175f0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
17600 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
17610 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17620 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
17630 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
17640 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17650 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Top = 1;.      }
17660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17670 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
17680 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
17690 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
176a0 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
176b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
176c0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
176d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
176e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
176f0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
17700 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
17710 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
17720 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  op = whereRangeV
17730 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
17740 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
17750 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
17760 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
17770 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
17780 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
17790 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
177a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
177b0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
177c0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
177d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
177e0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
177f0 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
17800 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
17810 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
17820 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
17830 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17840 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
17850 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
17860 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
17870 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
17880 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
17890 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
178a0 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
178b0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
178c0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
178d0 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
178e0 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
178f0 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
17900 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
17910 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
17920 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
17930 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
17940 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
17950 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
17960 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
17970 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
17980 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
17990 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
179a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
179b0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
179c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
179d0 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
179e0 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
179f0 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
17a00 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
17a10 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
17a20 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
17a30 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
17a40 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
17a50 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
17a60 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
17a70 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
17a80 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
17a90 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
17aa0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
17ab0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
17ac0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
17ad0 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a  O_IN|WO_IS) );..
17ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
17af0 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
17b00 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  nOut );.      if
17b10 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
17b20 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ob<=0 && pProbe-
17b30 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
17b40 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  nEq]>=0 ){.     
17b50 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
17b60 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
17b70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
17b80 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17b90 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
17ba0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
17bb0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
17bc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
17bd0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
17be0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
17bf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17c00 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
17c10 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
17c20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
17c30 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
17c40 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
17c50 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
17c60 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
17c70 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
17c80 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
17c90 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
17ca0 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
17cb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
17cc0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
17cd0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
17ce0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
17cf0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
17d00 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20 20  LITE_Stat34).   
17d10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17d20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17d30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
17d40 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
17d50 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
17d60 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29  ULL|WO_IS))!=0 )
17d70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
17d80 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17d90 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _EQ );.         
17da0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17db0 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
17dc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17dd0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
17de0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L );.           
17df0 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
17e00 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
17e10 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
17e20 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
17e30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
17e50 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
17e60 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
17e70 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
17e80 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
17e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17eb0 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
17ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17ed0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17ee0 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
17ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
17f00 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65  p out of the pTe
17f10 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  rm loop */.     
17f20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
17f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
17f40 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
17f50 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20  3LogEst(nOut);. 
17f60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
17f70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
17f80 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
17f90 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
17fb0 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
17fc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17fd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17fe0 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69   nOut==0 ).#endi
17ff0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
18000 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
18010 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52   += (pProbe->aiR
18020 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20  owLogEst[nEq] - 
18030 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
18040 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20  Est[nEq-1]);.   
18050 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
18060 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
18070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
18080 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
18090 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   no likelihood()
180a0 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74   value, assume t
180b0 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20  hat a .         
180c0 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55     ** "col IS NU
180d0 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  LL" expression m
180e0 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20  atches twice as 
180f0 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20  many rows .     
18100 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f         ** as (co
18110 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  l=?). */.       
18120 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
18130 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  += 10;.         
18140 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18150 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18160 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20  /* Set rCostIdx 
18170 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  to the cost of v
18180 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64  isiting selected
18190 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20   rows in index. 
181a0 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  Add.    ** it to
181b0 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69   pNew->rRun, whi
181c0 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
181d0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20  set to the cost 
181e0 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
181f0 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54   ** seek only. T
18200 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20  hen, if this is 
18210 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
18220 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f  ndex, add the co
18230 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73  st of.    ** vis
18240 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69  iting the rows i
18250 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
18260 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49  .  */.    rCostI
18270 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  dx = pNew->nOut 
18280 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
18290 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63  ->szIdxRow)/pSrc
182a0 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  ->pTab->szTabRow
182b0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
182c0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
182d0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43  Add(rLogSize, rC
182e0 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28  ostIdx);.    if(
182f0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
18300 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
18310 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
18320 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
18330 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
18340 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
18350 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  un, pNew->nOut +
18360 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   16);.    }.    
18370 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
18380 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
18390 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
183a0 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20  costMult);..    
183b0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
183c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
183d0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
183e0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
183f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
18400 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
18410 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
18420 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
18430 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  >pWC, pNew, rSiz
18440 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  e);.    rc = whe
18450 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
18460 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20  ilder, pNew);.. 
18470 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
18480 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
18490 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
184a0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
184b0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
184c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
184d0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e  w->nOut = nOutUn
184e0 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a  adjusted;.    }.
184f0 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
18500 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18510 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
18520 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
18530 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
18540 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  nColumn.    ){. 
18550 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
18560 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
18570 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
18580 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
18590 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
185a0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
185b0 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
185c0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
185d0 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
185e0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
185f0 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
18600 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
18610 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
18620 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
18630 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
18640 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
18650 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73  u.btree.nBtm = s
18660 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65  aved_nBtm;.  pNe
18670 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
18680 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20  = saved_nTop;.  
18690 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
186a0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
186b0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
186c0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
186d0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
186e0 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
186f0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
18700 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
18710 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
18720 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
18730 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
18740 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
18750 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
18760 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
18770 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
18780 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
18790 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
187a0 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
187b0 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
187c0 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
187d0 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
187e0 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
187f0 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
18800 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
18810 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
18820 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
18830 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
18840 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
18850 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
18860 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
18870 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
18880 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
18890 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
188a0 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
188b0 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
188c0 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
188d0 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
188e0 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
188f0 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
18900 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
18910 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
18920 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
18930 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
18940 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
18950 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
18960 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
18970 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
18980 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
18990 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
189a0 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
189b0 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
189c0 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
189d0 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
189e0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
189f0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
18a00 20 53 51 4c 49 54 45 5f 53 6b 69 70 53 63 61 6e   SQLITE_SkipScan
18a10 29 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  ).   && pProbe->
18a20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
18a30 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
18a40 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
18a50 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
18a60 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
18a70 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
18a80 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
18a90 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
18aa0 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
18ab0 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
18ac0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18ad0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
18ae0 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
18af0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
18b00 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
18b10 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
18b20 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
18b30 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
18b40 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
18b50 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
18b60 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
18b70 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
18b80 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
18b90 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
18ba0 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
18bb0 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
18bc0 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
18bd0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
18be0 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
18bf0 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
18c00 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
18c10 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
18c20 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
18c30 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
18c40 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
18c50 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
18c60 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
18c70 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
18c80 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
18c90 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
18ca0 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
18cb0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
18cc0 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
18cd0 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
18ce0 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
18cf0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
18d00 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
18d10 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
18d20 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64 42 74  , ("END %s.addBt
18d30 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d  reeIdx(%s), nEq=
18d40 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20  %d, rc=%d\n",.  
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62      pProbe->pTab
18d70 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f 62  le->zName, pProb
18d80 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f  e->zName, saved_
18d90 6e 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74  nEq, rc));.  ret
18da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18db0 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
18dc0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
18dd0 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
18de0 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
18df0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
18e00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18e10 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
18e20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
18e30 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
18e40 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
18e50 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
18e60 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
18e70 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
18e80 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
18e90 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
18ea0 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
18eb0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
18ec0 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
18ed0 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
18ee0 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
18ef0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
18f00 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
18f10 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
18f20 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
18f30 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74  *pOB;.  ExprList
18f40 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e   *aColExpr;.  in
18f50 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
18f60 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
18f70 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
18f80 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
18f90 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
18fa0 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
18fb0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
18fc0 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
18fd0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
18fe0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
18ff0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
19000 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
19010 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
19020 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
19030 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
19040 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
19050 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
19060 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
19070 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
19080 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
19090 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
190a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
190b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
190c0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
190d0 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
190e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
190f0 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d   if( (aColExpr =
19100 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
19110 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  r)!=0 ){.      f
19120 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
19130 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
19140 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
19150 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19160 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20  [jj]!=XN_EXPR ) 
19170 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
19180 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19190 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 78  rCompareSkip(pEx
191a0 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
191b0 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
191c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
191d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
191e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
191f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19200 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20   0;.}../* Check 
19210 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74  to see if a part
19220 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70  ial index with p
19230 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63  PartIndexWhere c
19240 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e  an be used.** in
19250 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65   the current que
19260 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ry.  Return true
19270 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e   if it can be an
19280 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
19290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
192a0 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
192b0 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20  Index(int iTab, 
192c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
192d0 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b  , Expr *pWhere){
192e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
192f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
19300 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
19310 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
19320 72 73 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  rse;.  while( pW
19330 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
19340 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65   ){.    if( !whe
19350 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19360 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57  ndex(iTab,pWC,pW
19370 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72  here->pLeft) ) r
19380 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68  eturn 0;.    pWh
19390 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52  ere = pWhere->pR
193a0 69 67 68 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ight;.  }.  if( 
193b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
193c0 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s & SQLITE_Enabl
193d0 65 51 50 53 47 20 29 20 70 50 61 72 73 65 20 3d  eQPSG ) pParse =
193e0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   0;.  for(i=0, p
193f0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
19400 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
19410 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
19420 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
19430 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
19440 28 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  ( (!ExprHasPrope
19450 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
19460 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72  omJoin) || pExpr
19470 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
19480 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 20 26 26  e==iTab).     &&
19490 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
194a0 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
194b0 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
194c0 54 61 62 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  Tab) .    ){.   
194d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
194e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
194f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
19500 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
19510 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
19520 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
19530 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
19540 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74  able.** is ident
19550 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  ified by pBuilde
19560 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
19570 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
19580 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
19590 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
195a0 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
195b0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
195c0 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
195d0 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
195e0 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
195f0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
19600 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
19610 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
19620 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
19630 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
19640 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
19650 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
19660 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
19670 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
19680 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
19690 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
196a0 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
196b0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
196c0 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
196d0 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
196e0 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
196f0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
19700 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
19720 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
19730 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
19740 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
19750 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
19760 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
19770 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
19780 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
19790 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
197a0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
197b0 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
197c0 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
197d0 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
197e0 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
197f0 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
19800 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
19810 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
19820 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
19830 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
19840 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
19850 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
19860 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
19870 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
19880 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
19890 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
198a0 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
198b0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
198c0 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
198d0 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
198e0 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
198f0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
19900 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
19910 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
19920 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
19930 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
19940 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
19950 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
19960 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
19970 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
19980 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
19990 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
199a0 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
199b0 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
199c0 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
199d0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
199e0 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
199f0 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77  ted values (nRow
19a00 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29  , nVisit, nSeek)
19a10 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61   often contain a
19a20 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a   large amount.**
19a30 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e   of uncertainty.
19a40 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
19a50 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65  n, scoring is de
19a60 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70  signed to pick p
19a70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f  lans that.** "do
19a80 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22   the least harm"
19a90 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65   if the estimate
19aa0 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65  s are inaccurate
19ab0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
19ac0 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66  a.** log(nRow) f
19ad0 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64  actor is omitted
19ae0 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65   from a non-cove
19af0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
19b00 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62  in order to.** b
19b10 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20  ias the scoring 
19b20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e  in favor of usin
19b30 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63  g an index, sinc
19b40 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  e the worst-case
19b50 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
19b60 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
19b70 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20  x is far better 
19b80 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63  than the worst-c
19b90 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ase performance.
19ba0 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  ** of a full tab
19bb0 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74  le scan..*/.stat
19bc0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
19bd0 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
19be0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
19bf0 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
19c00 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
19c10 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
19c20 20 6d 50 72 65 72 65 71 20 20 20 20 20 20 20 20   mPrereq        
19c30 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
19c40 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
19c50 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
19c60 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
19c70 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
19c80 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
19c90 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
19ca0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
19cb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
19cc0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
19cd0 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
19ce0 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d00 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
19d10 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
19d20 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
19d30 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
19d40 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
19d50 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
19d60 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
19d70 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
19d80 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
19d90 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
19da0 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
19db0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
19dc0 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
19dd0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
19de0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
19df0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
19e00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19e10 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
19e20 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
19e30 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
19e40 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
19e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19e60 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
19e70 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
19e80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19e90 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
19ea0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
19eb0 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
19ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19ed0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
19ee0 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19f00 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
19f10 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
19f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19f30 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
19f40 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
19f50 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
19f60 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
19f70 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
19f80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
19f90 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
19fa0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
19fb0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
19fc0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
19fd0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
19fe0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a000 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
1a010 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
1a020 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1a030 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
1a040 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1a050 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
1a060 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1a070 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
1a080 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
1a090 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
1a0a0 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
1a0b0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1a0c0 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
1a0d0 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1a0e0 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
1a0f0 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  IBIndex ){.    /
1a100 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
1a110 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
1a120 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
1a130 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
1a140 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
1a150 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  >pIBIndex;.  }el
1a160 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
1a170 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
1a180 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
1a190 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
1a1a0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
1a1b0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a1c0 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
1a1d0 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
1a1e0 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
1a1f0 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
1a200 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
1a210 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1a220 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
1a230 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
1a240 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
1a250 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
1a260 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
1a270 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
1a280 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
1a290 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
1a2a0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2c0 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
1a2d0 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
1a2e0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
1a2f0 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
1a300 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
1a310 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
1a320 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
1a330 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
1a340 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
1a350 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
1a360 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
1a370 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
1a380 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
1a390 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
1a3a0 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
1a3b0 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
1a3c0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
1a3d0 20 20 20 20 73 50 6b 2e 69 64 78 54 79 70 65 20      sPk.idxType 
1a3e0 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
1a3f0 5f 49 50 4b 3b 0a 20 20 20 20 61 69 52 6f 77 45  _IPK;.    aiRowE
1a400 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e  stPk[0] = pTab->
1a410 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20  nRowLogEst;.    
1a420 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
1a430 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  0;.    pFirst = 
1a440 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
1a450 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
1a460 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
1a470 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1a480 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
1a490 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
1a4a0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
1a4b0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
1a4c0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
1a4d0 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
1a4e0 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
1a4f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1a500 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
1a510 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
1a520 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d  robe = &sPk;.  }
1a530 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d  .  rSize = pTab-
1a540 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72  >nRowLogEst;.  r
1a550 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
1a560 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65  (rSize);..#ifnde
1a570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a580 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
1a590 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
1a5a0 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
1a5b0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
1a5c0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74       /* Not part
1a5d0 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69   of an OR optimi
1a5e0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20  zation */.   && 
1a5f0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1a600 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
1a610 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
1a620 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
1a630 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1a640 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
1a650 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
1a660 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20 20  >pIBIndex==0    
1a670 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45    /* Has no INDE
1a680 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  XED BY clause */
1a690 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
1a6a0 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f 2a  .notIndexed   /*
1a6b0 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45   Has no NOT INDE
1a6c0 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  XED clause */.  
1a6d0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
1a6e0 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  b)         /* No
1a6f0 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  t WITHOUT ROWID 
1a700 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57  table. (FIXME: W
1a710 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26  hy not?) */.   &
1a720 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f  & !pSrc->fg.isCo
1a730 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20  rrelated /* Not 
1a740 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
1a750 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21  query */.   && !
1a760 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72  pSrc->fg.isRecur
1a770 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72  sive  /* Not a r
1a780 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20  ecursive common 
1a790 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
1a7a0 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  . */.  ){.    /*
1a7b0 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
1a7c0 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
1a7d0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1a7e0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
1a7f0 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
1a800 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
1a810 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
1a820 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
1a830 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
1a840 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
1a850 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1a860 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1a870 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
1a880 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
1a890 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
1a8a0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
1a8b0 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
1a8c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
1a8d0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
1a8e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70       pNew->nSkip
1a8f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
1a900 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
1a910 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
1a920 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1a930 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a940 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
1a950 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
1a960 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
1a970 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
1a980 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
1a990 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
1a9a0 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f   ** estimated to
1a9b0 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20   be X*N*log2(N) 
1a9c0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
1a9d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1a9e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1a9f0 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
1aa00 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20  xed and where X 
1aa10 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29  is 7 (LogEst=28)
1aa20 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   for normal.    
1aa30 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72      ** tables or
1aa40 20 30 2e 35 20 28 4c 6f 67 45 73 74 3d 2d 31 30   0.5 (LogEst=-10
1aa50 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  ) for views and 
1aa60 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1aa70 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
1aa80 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65  * of X is smalle
1aa90 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  r for views and 
1aaa0 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68  subqueries so th
1aab0 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  at the query pla
1aac0 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  nner.        ** 
1aad0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67  will be more agg
1aae0 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65  ressive about ge
1aaf0 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74  nerating automat
1ab00 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20  ic indexes for. 
1ab10 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20         ** those 
1ab20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74  objects, since t
1ab30 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72  here is no oppor
1ab40 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63  tunity to add sc
1ab50 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  hema.        ** 
1ab60 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75  indexes on subqu
1ab70 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e  eries and views.
1ab80 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1ab90 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53  ->rSetup = rLogS
1aba0 69 7a 65 20 2b 20 72 53 69 7a 65 3b 0a 20 20 20  ize + rSize;.   
1abb0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
1abc0 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
1abd0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1abe0 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
1abf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1ac00 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 38 3b  w->rSetup += 28;
1ac10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ac20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1ac30 72 53 65 74 75 70 20 2d 3d 20 31 30 3b 0a 20 20  rSetup -= 10;.  
1ac40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ac50 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
1ac60 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
1ac70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
1ac80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ac90 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20  New->rSetup<0 ) 
1aca0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1acb0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
1acc0 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
1acd0 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
1ace0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1acf0 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
1ad00 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
1ad10 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
1ad20 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
1ad30 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
1ad40 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
1ad50 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c   knowing how sel
1ad60 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
1ad70 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
1ad80 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
1ad90 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
1ada0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
1adb0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
1adc0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
1add0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1ade0 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
1adf0 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
1ae00 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
1ae10 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1ae20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1ae30 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
1ae40 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
1ae50 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1ae60 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
1ae70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1ae80 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
1ae90 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
1aea0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
1aeb0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1aec0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1aed0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
1aee0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
1aef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1af00 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
1af10 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
1af20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 49 66 20  all indices. If 
1af30 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
1af40 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1af50 74 68 65 6e 20 6f 6e 6c 79 20 0a 20 20 2a 2a 20  then only .  ** 
1af60 63 6f 6e 73 69 64 65 72 20 69 6e 64 65 78 20 70  consider index p
1af70 50 72 6f 62 65 2e 20 20 2a 2f 0a 20 20 66 6f 72  Probe.  */.  for
1af80 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
1af90 20 26 26 20 70 50 72 6f 62 65 3b 20 0a 20 20 20   && pProbe; .   
1afa0 20 20 20 70 50 72 6f 62 65 3d 28 70 53 72 63 2d     pProbe=(pSrc-
1afb0 3e 70 49 42 49 6e 64 65 78 20 3f 20 30 20 3a 20  >pIBIndex ? 0 : 
1afc0 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 2c 20  pProbe->pNext), 
1afd0 69 53 6f 72 74 49 64 78 2b 2b 0a 20 20 29 7b 0a  iSortIdx++.  ){.
1afe0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1aff0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
1b000 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55  .     && !whereU
1b010 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
1b020 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  x(pSrc->iCursor,
1b030 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
1b040 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
1b050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b060 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63  pNew->iTab!=pSrc
1b070 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a  ->iCursor );  /*
1b080 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64   See ticket [98d
1b090 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20  973b8f5] */.    
1b0a0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
1b0b0 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
1b0c0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1b0d0 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
1b0e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 72 6f    }.    if( pPro
1b0f0 62 65 2d 3e 62 4e 6f 51 75 65 72 79 20 29 20 63  be->bNoQuery ) c
1b100 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 53 69  ontinue;.    rSi
1b110 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
1b120 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
1b130 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
1b140 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
1b150 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
1b160 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
1b170 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a  btree.nTop = 0;.
1b180 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
1b190 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
1b1a0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
1b1b0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1b1c0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
1b1d0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
1b1e0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
1b1f0 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  req;.    pNew->n
1b200 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
1b210 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
1b220 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a  Index = pProbe;.
1b230 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67      b = indexMig
1b240 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
1b250 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f  y(pBuilder, pPro
1b260 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  be, pSrc->iCurso
1b270 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f  r);.    /* The O
1b280 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66  NEPASS_DESIRED f
1b290 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72  lags never occur
1b2a0 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  s together with 
1b2b0 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
1b2c0 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d  assert( (pWInfo-
1b2d0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1b2e0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
1b2f0 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20  RED)==0 || b==0 
1b300 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  );.    if( pProb
1b310 65 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49  e->idxType==SQLI
1b320 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b 20 29  TE_IDXTYPE_IPK )
1b330 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
1b340 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
1b350 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
1b360 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1b370 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
1b380 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
1b390 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
1b3a0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
1b3b0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
1b3c0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b3d0 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
1b3e0 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
1b3f0 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
1b400 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
1b410 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
1b420 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
1b430 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
1b440 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1b450 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1b460 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1b470 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1b480 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b490 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1b4a0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
1b4b0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
1b4c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1b4d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
1b4e0 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
1b4f0 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
1b500 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
1b510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
1b520 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1b530 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
1b540 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
1b550 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
1b560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b570 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
1b580 64 20 26 20 70 50 72 6f 62 65 2d 3e 63 6f 6c 4e  d & pProbe->colN
1b590 6f 74 49 64 78 65 64 3b 0a 20 20 20 20 20 20 20  otIdxed;.       
1b5a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1b5b0 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
1b5c0 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
1b5d0 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
1b5e0 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
1b5f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  }..      /* Full
1b600 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
1b610 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20  */.      if( b. 
1b620 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77        || !HasRow
1b630 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20  id(pTab).       
1b640 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  || pProbe->pPart
1b650 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
1b660 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
1b670 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
1b680 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
1b690 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
1b6a0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
1b6b0 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
1b6c0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
1b6d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1b6e0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
1b6f0 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
1b700 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
1b710 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
1b720 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
1b730 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
1b740 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
1b750 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
1b760 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
1b770 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
1b780 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
1b790 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
1b7a0 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
1b7b0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1b7c0 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
1b7d0 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
1b7e0 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
1b7f0 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
1b800 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
1b810 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
1b820 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
1b830 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
1b840 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
1b850 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ows. */.        
1b860 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
1b870 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ze + 1 + (15*pPr
1b880 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
1b890 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
1b8a0 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20         if( m!=0 
1b8b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b8c0 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  If this is a non
1b8d0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
1b8e0 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65  scan, add in the
1b8f0 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20   cost of.       
1b900 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c     ** doing tabl
1b910 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20  e lookups.  The 
1b920 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20  cost will be 3x 
1b930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
1b940 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75          ** looku
1b950 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61  ps.  Take into a
1b960 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61  ccount WHERE cla
1b970 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 63  use terms that c
1b980 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  an be.          
1b990 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69  ** satisfied usi
1b9a0 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
1b9b0 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e  x, and that do n
1b9c0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20 20 20  ot require a.   
1b9d0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
1b9e0 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20  lookup. */.     
1b9f0 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f       LogEst nLoo
1ba00 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36  kup = rSize + 16
1ba10 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a  ;  /* Base cost:
1ba20 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20    N*3 */.       
1ba30 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1ba40 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
1ba50 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  pSrc->iCursor;. 
1ba60 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c           WhereCl
1ba70 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57  ause *pWC2 = &pW
1ba80 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20  Info->sWC;.     
1ba90 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1baa0 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69  i<pWC2->nTerm; i
1bab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1bac0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1bad0 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69  rm = &pWC2->a[ii
1bae0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
1baf0 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
1bb00 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70 54  overedByIndex(pT
1bb10 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72  erm->pExpr, iCur
1bb20 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
1bb30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1bb60 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c  Term can be eval
1bb70 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74  uated using just
1bb80 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20   the index.  So 
1bb90 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20  reduce.         
1bba0 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74     ** the expect
1bbb0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  ed number of tab
1bbc0 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72  le lookups accor
1bbd0 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20  dingly */.      
1bbe0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1bbf0 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
1bc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
1bc10 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d  Lookup += pTerm-
1bc20 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
1bc30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
1bc50 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20  okup--;.        
1bc60 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1bc70 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1bc80 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f  _EQ|WO_IS) ) nLo
1bc90 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20  okup -= 19;.    
1bca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bcb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1bcc0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1bcd0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
1bce0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
1bcf0 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20  Run, nLookup);. 
1bd00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bd10 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
1bd20 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
1bd30 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
1bd40 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
1bd50 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
1bd60 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
1bd70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1bd80 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
1bd90 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
1bda0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1bdb0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
1bdc0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
1bdd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1bde0 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72   }..    pBuilder
1bdf0 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a  ->bldFlags = 0;.
1be00 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1be10 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
1be20 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
1be30 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20  pProbe, 0);.    
1be40 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c  if( pBuilder->bl
1be50 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42  dFlags==SQLITE_B
1be60 4c 44 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  LDF_INDEXED ){. 
1be70 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e       /* If a non
1be80 2d 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73  -unique index is
1be90 20 75 73 65 64 2c 20 6f 72 20 69 66 20 61 20 70   used, or if a p
1bea0 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79  refix of the key
1beb0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e   for.      ** un
1bec0 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73  ique index is us
1bed0 65 64 20 28 6d 61 6b 69 6e 67 20 74 68 65 20 69  ed (making the i
1bee0 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c  ndex functionall
1bef0 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20  y non-unique).  
1bf00 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1bf10 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74  sqlite_stat1 dat
1bf20 61 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74  a becomes import
1bf30 61 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e 67 20  ant for scoring 
1bf40 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  the.      ** pla
1bf50 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  n */.      pTab-
1bf60 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
1bf70 53 74 61 74 73 55 73 65 64 3b 0a 20 20 20 20 7d  StatsUsed;.    }
1bf80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1bf90 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
1bfa0 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
1bfb0 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70  Stat4ProbeFree(p
1bfc0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a  Builder->pRec);.
1bfd0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
1bfe0 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  ecValid = 0;.   
1bff0 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
1c000 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
1c010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c030 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1c040 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1c050 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c 72   pIdxInfo is alr
1c060 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77  eady populated w
1c070 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ith all constrai
1c080 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20  nts that may.** 
1c090 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 76  be used by the v
1c0a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64 65  irtual table ide
1c0b0 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c  ntified by pBuil
1c0c0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
1c0d0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1c0e0 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65 74  n marks a subset
1c0f0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74 72   of those constr
1c100 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69 6e  aints usable, in
1c110 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42 65  vokes the.** xBe
1c120 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61  stIndex method a
1c130 6e 64 20 61 64 64 73 20 74 68 65 20 72 65 74 75  nd adds the retu
1c140 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42 75  rned plan to pBu
1c150 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  ilder..**.** A c
1c160 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61 72  onstraint is mar
1c170 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a  ked usable if:.*
1c180 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e  *.**   * Argumen
1c190 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63 61  t mUsable indica
1c1a0 74 65 73 20 74 68 61 74 20 69 74 73 20 70 72 65  tes that its pre
1c1b0 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20 61  requisites are a
1c1c0 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a  vailable, and.**
1c1d0 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e 6f  .**   * It is no
1c1e0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  t one of the ope
1c1f0 72 61 74 6f 72 73 20 73 70 65 63 69 66 69 65 64  rators specified
1c200 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64 65   in the mExclude
1c210 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20   mask passed.** 
1c220 20 20 20 20 61 73 20 74 68 65 20 66 6f 75 72 74      as the fourt
1c230 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69 63  h argument (whic
1c240 68 20 69 6e 20 70 72 61 63 74 69 63 65 20 69 73  h in practice is
1c250 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72   either WO_IN or
1c260 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   0)..**.** Argum
1c270 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20 61  ent mPrereq is a
1c280 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   mask of tables 
1c290 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c2a0 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a  nned before the.
1c2b0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1c2c0 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54 68   in question. Th
1c2d0 65 73 65 20 61 72 65 20 61 64 64 65 64 20 74 6f  ese are added to
1c2e0 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72 65   the plans prere
1c2f0 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f  quisites.** befo
1c300 72 65 20 69 74 20 69 73 20 61 64 64 65 64 20 74  re it is added t
1c310 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  o pBuilder..**.*
1c320 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
1c330 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74 20  er *pbIn is set 
1c340 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 70  to true if the p
1c350 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42 75  lan added to pBu
1c360 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e  ilder.** uses on
1c370 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20  e or more WO_IN 
1c380 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20  terms, or false 
1c390 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1c3a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1c3b0 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1c3c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1c3d0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
1c3e0 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
1c3f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c400 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c   /* Mask of tabl
1c410 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1c420 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61  used. */.  Bitma
1c430 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20 20  sk mUsable,     
1c440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c450 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61 62  sk of usable tab
1c460 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78  les */.  u16 mEx
1c470 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20 20  clude,          
1c480 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 6c           /* Excl
1c490 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67 20  ude terms using 
1c4a0 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20  these operators 
1c4b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  */.  sqlite3_ind
1c4c0 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
1c4d0 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  o,   /* Populate
1c4e0 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42 65  d object for xBe
1c4f0 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  stIndex */.  u16
1c500 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20   mNoOmit,       
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c520 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73  Do not omit thes
1c530 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
1c540 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20  .  int *pbIn    
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
1c570 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20  if plan uses an 
1c580 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b  IN(...) op */.){
1c590 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1c5a0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1c5b0 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71  pWC;.  struct sq
1c5c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1c5d0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
1c5e0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
1c5f0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1c600 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
1c610 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
1c620 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
1c630 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
1c640 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20  xTerm;.  int rc 
1c650 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
1c660 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d  hereLoop *pNew =
1c670 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1c680 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c690 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1c6a0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  nfo->pParse;.  s
1c6b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c6c0 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69  em *pSrc = &pBui
1c6d0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  lder->pWInfo->pT
1c6e0 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
1c6f0 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f  iTab];.  int nCo
1c700 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
1c710 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
1c720 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55  ;..  assert( (mU
1c730 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29  sable & mPrereq)
1c740 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a  ==mPrereq );.  *
1c750 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77  pbIn = 0;.  pNew
1c760 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72  ->prereq = mPrer
1c770 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  eq;..  /* Set th
1c780 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e  e usable flag on
1c790 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 63   the subset of c
1c7a0 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74  onstraints ident
1c7b0 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61  ified by .  ** a
1c7c0 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65  rguments mUsable
1c7d0 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a   and mExclude. *
1c7e0 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
1c7f0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
1c800 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1c810 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
1c820 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
1c830 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1c840 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
1c850 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  ns++){.    Where
1c860 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
1c870 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e  WC->a[pIdxCons->
1c880 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20  iTermOffset];.  
1c890 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
1c8a0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  le = 0;.    if( 
1c8b0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
1c8c0 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d  ght & mUsable)==
1c8d0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1c8e0 68 74 20 0a 20 20 20 20 20 26 26 20 28 70 54 65  ht .     && (pTe
1c8f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c900 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20  mExclude)==0.   
1c910 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f   ){.      pIdxCo
1c920 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
1c930 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c940 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
1c950 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20  utput fields of 
1c960 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
1c970 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
1c980 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73   */.  memset(pUs
1c990 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
1c9a0 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74  Usage[0])*nConst
1c9b0 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74  raint);.  assert
1c9c0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
1c9d0 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20  ToFreeIdxStr==0 
1c9e0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  );.  pIdxInfo->i
1c9f0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
1ca00 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
1ca10 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
1ca20 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
1ca30 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1ca40 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
1ca50 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
1ca60 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49   (double)2;.  pI
1ca70 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1ca80 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49  dRows = 25;.  pI
1ca90 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1caa0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1cab0 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c  ->colUsed = (sql
1cac0 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d  ite3_int64)pSrc-
1cad0 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20  >colUsed;..  /* 
1cae0 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75  Invoke the virtu
1caf0 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e  al table xBestIn
1cb00 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a  dex() method */.
1cb10 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
1cb20 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 53 72  ndex(pParse, pSr
1cb30 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66  c->pTab, pIdxInf
1cb40 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  o);.  if( rc ){.
1cb50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cb60 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
1cb70 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1cb80 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
1cb90 6f 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  od returns SQLIT
1cba0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
1cbb0 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 20 20 2a  at means.      *
1cbc0 2a 20 74 68 61 74 20 74 68 65 20 70 61 72 74 69  * that the parti
1cbd0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
1cbe0 6e 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  n of parameters 
1cbf0 70 72 6f 76 69 64 65 64 20 69 73 20 75 6e 75 73  provided is unus
1cc00 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  able..      ** M
1cc10 61 6b 65 20 6e 6f 20 65 6e 74 72 69 65 73 20 69  ake no entries i
1cc20 6e 20 74 68 65 20 6c 6f 6f 70 20 74 61 62 6c 65  n the loop table
1cc30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cc40 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
1cc50 66 66 2c 20 28 22 20 20 5e 5e 5e 5e 2d 2d 2d 20  ff, ("  ^^^^--- 
1cc60 6e 6f 6e 2d 76 69 61 62 6c 65 20 70 6c 61 6e 20  non-viable plan 
1cc70 72 65 6a 65 63 74 65 64 21 5c 6e 22 29 29 3b 0a  rejected!\n"));.
1cc80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cc90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1cca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ccb0 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b  ..  mxTerm = -1;
1ccc0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1ccd0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
1cce0 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d  aint );.  for(i=
1ccf0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1cd00 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
1cd10 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e  erm[i] = 0;.  pN
1cd20 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
1cd30 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43  ask = 0;.  pIdxC
1cd40 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
1cd50 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1cd60 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
1cd70 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
1cd80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1cd90 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
1cda0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
1cdb0 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
1cdc0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
1cdd0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
1cde0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
1cdf0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1ce00 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  erm;.      int j
1ce10 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
1ce20 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
1ce30 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
1ce40 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c  traint.       ||
1ce50 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a   j<0.       || j
1ce60 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
1ce70 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
1ce80 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
1ce90 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73       || pIdxCons
1cea0 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20  ->usable==0.    
1ceb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
1cec0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ced0 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64  rse,"%s.xBestInd
1cee0 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  ex malfunction",
1cef0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1cf00 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1cf10 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f 2d 3e  case( pIdxInfo->
1cf20 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1cf30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1cf40 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cf50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1cf60 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1cf70 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
1cf80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cf90 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
1cfa0 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
1cfb0 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
1cfc0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
1cfd0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
1cfe0 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
1cff0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1d000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
1d010 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
1d020 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
1d030 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1d040 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
1d050 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
1d060 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
1d070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d080 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
1d090 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1d0a0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
1d0b0 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
1d0c0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
1d0d0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1d0e0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
1d0f0 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
1d100 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1d110 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
1d120 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1d130 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1d140 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1d150 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1d160 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
1d170 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
1d180 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
1d190 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
1d1a0 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
1d1b0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1d1c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
1d1d0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
1d1e0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
1d1f0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
1d200 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
1d210 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
1d220 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
1d230 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
1d240 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
1d250 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
1d260 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1d270 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
1d280 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
1d290 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
1d2a0 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1d2b0 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
1d2c0 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20  In = 1; assert( 
1d2d0 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49  (mExclude & WO_I
1d2e0 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  N)==0 );.      }
1d2f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1d300 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1d310 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a  sk &= ~mNoOmit;.
1d320 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1d330 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 66 6f  = mxTerm+1;.  fo
1d340 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 54 65 72 6d  r(i=0; i<=mxTerm
1d350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1d360 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  pNew->aLTerm[i]=
1d370 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1d380 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 61 72 67 76  he non-zero argv
1d390 49 64 78 20 76 61 6c 75 65 73 20 6d 75 73 74 20  Idx values must 
1d3a0 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 20 20  be contiguous.  
1d3b0 52 61 69 73 65 20 61 6e 0a 20 20 20 20 20 20 2a  Raise an.      *
1d3c0 2a 20 65 72 72 6f 72 20 69 66 20 74 68 65 79 20  * error if they 
1d3d0 61 72 65 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20  are not */.     
1d3e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d3f0 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73  (pParse,"%s.xBes
1d400 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
1d410 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e  on",pSrc->pTab->
1d420 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 74 65  zName);.      te
1d430 73 74 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f  stcase( pIdxInfo
1d440 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1d450 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
1d460 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1d470 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1d480 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
1d490 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
1d4a0 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  );.  pNew->u.vta
1d4b0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
1d4c0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 70  nfo->idxNum;.  p
1d4d0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1d4e0 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
1d4f0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1d500 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  r;.  pIdxInfo->n
1d510 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1d520 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1d530 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
1d540 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
1d550 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
1d560 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
1d570 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1d580 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
1d590 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
1d5a0 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  rBy : 0);.  pNew
1d5b0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1d5c0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1d5d0 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f  ite3LogEstFromDo
1d5e0 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65  uble(pIdxInfo->e
1d5f0 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
1d600 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
1d610 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
1d620 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
1d630 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ows);..  /* Set 
1d640 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
1d650 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65   flag if the xBe
1d660 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64  stIndex() method
1d670 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a 20   indicated.  ** 
1d680 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
1d690 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73 74  ll visit at most
1d6a0 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72 20   one row. Clear 
1d6b0 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f  it otherwise. */
1d6c0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
1d6d0 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c 49  >idxFlags & SQLI
1d6e0 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
1d6f0 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65 77  IQUE ){.    pNew
1d700 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
1d710 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c  RE_ONEROW;.  }el
1d720 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  se{.    pNew->ws
1d730 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
1d740 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 63  ONEROW;.  }.  rc
1d750 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1d760 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1d770 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  w);.  if( pNew->
1d780 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1d790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1d7a0 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
1d7b0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 4e  .idxStr);.    pN
1d7c0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1d7d0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 57  ree = 0;.  }.  W
1d7e0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
1d7f0 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72 65  , ("  bIn=%d pre
1d800 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72 65  reqIn=%04llx pre
1d810 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e 22  reqOut=%04llx\n"
1d820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d830 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20 28          *pbIn, (
1d840 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d  sqlite3_uint64)m
1d850 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  Prereq,.        
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1d870 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28 70  qlite3_uint64)(p
1d880 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1d890 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72 65  Prereq)));..  re
1d8a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d8b0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
1d8c0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 72  on is invoked fr
1d8d0 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 78 42 65  om within an xBe
1d8e0 73 74 49 6e 64 65 78 28 29 20 63 61 6c 6c 62 61  stIndex() callba
1d8f0 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e  ck, it.** return
1d900 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1d910 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1d920 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
1d930 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  he collation.** 
1d940 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61  sequence associa
1d950 74 65 64 20 77 69 74 68 20 65 6c 65 6d 65 6e 74  ted with element
1d960 20 69 43 6f 6e 73 20 6f 66 20 74 68 65 20 73 71   iCons of the sq
1d970 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1d980 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  .aConstraint.** 
1d990 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 69 43  array. Or, if iC
1d9a0 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66 20 72 61  ons is out of ra
1d9b0 6e 67 65 20 6f 72 20 74 68 65 72 65 20 69 73 20  nge or there is 
1d9c0 6e 6f 20 61 63 74 69 76 65 20 78 42 65 73 74 49  no active xBestI
1d9d0 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65  ndex.** call, re
1d9e0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f  turn NULL..*/.co
1d9f0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1da00 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e  3_vtab_collation
1da10 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
1da20 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 69  nfo *pIdxInfo, i
1da30 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20 48 69 64  nt iCons){.  Hid
1da40 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48  denIndexInfo *pH
1da50 69 64 64 65 6e 20 3d 20 28 48 69 64 64 65 6e 49  idden = (HiddenI
1da60 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78 49  ndexInfo*)&pIdxI
1da70 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  nfo[1];.  const 
1da80 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a  char *zRet = 0;.
1da90 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20 26    if( iCons>=0 &
1daa0 26 20 69 43 6f 6e 73 3c 70 49 64 78 49 6e 66 6f  & iCons<pIdxInfo
1dab0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  ->nConstraint ){
1dac0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
1dad0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54   = 0;.    int iT
1dae0 65 72 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  erm = pIdxInfo->
1daf0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 43 6f 6e  aConstraint[iCon
1db00 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s].iTermOffset;.
1db10 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
1db20 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e 61 5b 69  Hidden->pWC->a[i
1db30 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20  Term].pExpr;.   
1db40 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 20 29   if( pX->pLeft )
1db50 7b 0a 20 20 20 20 20 20 70 43 20 3d 20 73 71 6c  {.      pC = sql
1db60 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
1db70 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64 65 6e  eCollSeq(pHidden
1db80 2d 3e 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  ->pParse, pX->pL
1db90 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
1dba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74  ;.    }.    zRet
1dbb0 20 3d 20 28 70 43 20 3f 20 70 43 2d 3e 7a 4e 61   = (pC ? pC->zNa
1dbc0 6d 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42  me : sqlite3StrB
1dbd0 49 4e 41 52 59 29 3b 0a 20 20 7d 0a 20 20 72 65  INARY);.  }.  re
1dbe0 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
1dbf0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
1dc00 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
1dc10 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
1dc20 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
1dc30 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
1dc40 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
1dc50 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
1dc60 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
1dc70 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
1dc80 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1dc90 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53   no LEFT or CROS
1dca0 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20  S JOIN joins in 
1dcb0 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20  the query, both 
1dcc0 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d  mPrereq and.** m
1dcd0 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74  Unusable are set
1dce0 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65   to 0. Otherwise
1dcf0 2c 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d  , mPrereq is a m
1dd00 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20  ask of all FROM 
1dd10 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65  clause.** entrie
1dd20 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
1dd30 6f 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ore the virtual 
1dd40 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1dd50 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65  M clause and are
1dd60 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72  .** separated fr
1dd70 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
1dd80 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52  t one LEFT or CR
1dd90 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61  OSS JOIN. Simila
1dda0 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75  rly, the.** mUnu
1ddb0 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61  sable mask conta
1ddc0 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  ins all FROM cla
1ddd0 75 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  use entries that
1dde0 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
1ddf0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1de00 65 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61  e and are separa
1de10 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61  ted from it by a
1de20 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54  t least one LEFT
1de30 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f   or .** CROSS JO
1de40 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  IN. .**.** For e
1de50 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
1de60 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a  uery were:.**.**
1de70 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20     ... FROM t1, 
1de80 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c  t2 LEFT JOIN t3,
1de90 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f   t4, vt CROSS JO
1dea0 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a  IN t5, t6;.**.**
1deb0 20 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f   then mPrereq co
1dec0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31  rresponds to (t1
1ded0 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61  , t2) and mUnusa
1dee0 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e  ble to (t5, t6).
1def0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74  .**.** All the t
1df00 61 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71  ables in mPrereq
1df10 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1df20 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
1df30 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20  ent virtual .** 
1df40 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65  table. So any te
1df50 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c  rms for which al
1df60 6c 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  l prerequisites 
1df70 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
1df80 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79   .** mPrereq may
1df90 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73   be specified as
1dfa0 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c   "usable" in all
1dfb0 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1dfc0 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72  ndex. .** Conver
1dfd0 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73  sely, all tables
1dfe0 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75   in mUnusable mu
1dff0 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66  st be scanned af
1e000 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ter the current.
1e010 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1e020 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66  , so any terms f
1e030 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65  or which the pre
1e040 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c  requisites overl
1e050 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73  ap with.** mUnus
1e060 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61  able should alwa
1e070 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64  ys be configured
1e080 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22   as "not-usable"
1e090 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e   for xBestIndex.
1e0a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1e0b0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1e0c0 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
1e0d0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1e0e0 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  ,  /* WHERE clau
1e0f0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
1e100 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  /.  Bitmask mPre
1e110 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
1e120 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
1e130 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1e140 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20  before this one 
1e150 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  */.  Bitmask mUn
1e160 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20  usable          
1e170 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
1e180 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1e190 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20   after this one 
1e1a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1e1b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1e1c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e1d0 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ode */.  WhereIn
1e1e0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1e1f0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
1e200 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
1e210 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1e220 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1e230 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1e240 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1e250 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1e260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e270 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1e280 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1e290 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
1e2a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1e2b0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
1e2c0 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ch */.  sqlite3_
1e2d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20  index_info *p;  
1e2e0 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
1e2f0 6f 20 70 61 73 73 20 74 6f 20 78 42 65 73 74 49  o pass to xBestI
1e300 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20  ndex() */.  int 
1e310 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1e320 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e330 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1e340 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20  s in p */.  int 
1e350 62 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  bIn;            
1e360 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e370 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e   if plan uses IN
1e380 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a  (...) operator *
1e390 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1e3a0 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  New;.  Bitmask m
1e3b0 42 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Best;           
1e3c0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73      /* Tables us
1e3d0 65 64 20 62 79 20 62 65 73 74 20 70 6f 73 73 69  ed by best possi
1e3e0 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31  ble plan */.  u1
1e3f0 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73  6 mNoOmit;..  as
1e400 73 65 72 74 28 20 28 6d 50 72 65 72 65 71 20 26  sert( (mPrereq &
1e410 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29   mUnusable)==0 )
1e420 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
1e430 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1e440 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
1e450 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 57 43 20  ->pParse;.  pWC 
1e460 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
1e470 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1e480 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
1e490 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
1e4a0 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
1e4b0 61 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 49  ab];.  assert( I
1e4c0 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70  sVirtual(pSrc->p
1e4d0 54 61 62 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c  Tab) );.  p = al
1e4e0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
1e4f0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e  pParse, pWC, mUn
1e500 75 73 61 62 6c 65 2c 20 70 53 72 63 2c 20 70 42  usable, pSrc, pB
1e510 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79  uilder->pOrderBy
1e520 2c 20 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d 69  , .      &mNoOmi
1e530 74 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  t);.  if( p==0 )
1e540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e550 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65  OMEM_BKPT;.  pNe
1e560 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1e570 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1e580 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1e590 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
1e5a0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
1e5b0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1e5c0 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61   = 0;.  nConstra
1e5d0 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72  int = p->nConstr
1e5e0 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
1e5f0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72  eLoopResize(pPar
1e600 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43  se->db, pNew, nC
1e610 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20  onstraint) ){.  
1e620 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e630 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1e640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e650 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1e660 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61  }..  /* First ca
1e670 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  ll xBestIndex() 
1e680 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
1e690 69 6e 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a  ints usable. */.
1e6a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1e6b0 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e 61  00, ("BEGIN %s.a
1e6c0 64 64 56 69 72 74 75 61 6c 28 29 5c 6e 22 2c 20  ddVirtual()\n", 
1e6d0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1e6e0 65 29 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  e));.  WHERETRAC
1e6f0 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1e700 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1e710 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  le\n"));.  rc = 
1e720 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1e730 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1e740 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1e750 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  S, 0, p, mNoOmit
1e760 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49  , &bIn);..  /* I
1e770 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42  f the call to xB
1e780 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1e790 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65  all terms enable
1e7a0 64 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61  d produced a pla
1e7b0 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73  n.  ** that does
1e7c0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
1e7d0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28   source tables (
1e7e0 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68  IOW: a plan with
1e7f0 20 6d 42 65 73 74 3d 3d 30 29 0a 20 20 2a 2a 20   mBest==0).  ** 
1e800 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  and does not use
1e810 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72   an IN(...) oper
1e820 61 74 6f 72 2c 20 74 68 65 6e 20 74 68 65 72 65  ator, then there
1e830 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e840 6d 61 6b 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  making .  ** any
1e850 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
1e860 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 73  o xBestIndex() s
1e870 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ince they will a
1e880 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ll return the sa
1e890 6d 65 0a 20 20 2a 2a 20 72 65 73 75 6c 74 20 28  me.  ** result (
1e8a0 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  if the xBestInde
1e8b0 78 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  x() implementati
1e8c0 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a  on is sane). */.
1e8d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e8e0 5f 4f 4b 20 26 26 20 28 28 6d 42 65 73 74 20 3d  _OK && ((mBest =
1e8f0 20 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26   (pNew->prereq &
1e900 20 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20 7c   ~mPrereq))!=0 |
1e910 7c 20 62 49 6e 29 20 29 7b 0a 20 20 20 20 69 6e  | bIn) ){.    in
1e920 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20  t seenZero = 0; 
1e930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e940 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69  rue if a plan wi
1e950 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65  th no prereqs se
1e960 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65  en */.    int se
1e970 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20  enZeroNoIN = 0; 
1e980 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20          /* Plan 
1e990 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1e9a0 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73  and no IN(...) s
1e9b0 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  een */.    Bitma
1e9c0 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20  sk mPrev = 0;.  
1e9d0 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e    Bitmask mBestN
1e9e0 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oIn = 0;..    /*
1e9f0 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f   If the plan pro
1ea00 64 75 63 65 64 20 62 79 20 74 68 65 20 65 61 72  duced by the ear
1ea10 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61  lier call uses a
1ea20 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20  n IN(...) term, 
1ea30 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73  call.    ** xBes
1ea40 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68  tIndex again, th
1ea50 69 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28  is time with IN(
1ea60 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62  ...) terms disab
1ea70 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  led. */.    if( 
1ea80 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45  bIn ){.      WHE
1ea90 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1eaa0 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1eab0 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c  l usable w/o IN\
1eac0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n"));.      rc =
1ead0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1eae0 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20  tualOne(.       
1eaf0 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72     pBuilder, mPr
1eb00 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57  ereq, ALLBITS, W
1eb10 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  O_IN, p, mNoOmit
1eb20 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61  , &bIn);.      a
1eb30 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b  ssert( bIn==0 );
1eb40 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e  .      mBestNoIn
1eb50 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20   = pNew->prereq 
1eb60 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20  & ~mPrereq;.    
1eb70 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d    if( mBestNoIn=
1eb80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =0 ){.        se
1eb90 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20  enZero = 1;.    
1eba0 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e      seenZeroNoIN
1ebb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1ebc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c    }..    /* Call
1ebd0 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65   xBestIndex once
1ebe0 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e   for each distin
1ebf0 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65  ct value of (pre
1ec00 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1ec10 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20  req) .    ** in 
1ec20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73  the set of terms
1ec30 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74   that apply to t
1ec40 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75  he current virtu
1ec50 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
1ec60 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1ec70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ec80 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74  int i;.      Bit
1ec90 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c  mask mNext = ALL
1eca0 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65  BITS;.      asse
1ecb0 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20  rt( mNext>0 );. 
1ecc0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ecd0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1ece0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
1ecf0 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20  sk mThis = (.   
1ed00 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b           pWC->a[
1ed10 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
1ed20 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70  ].iTermOffset].p
1ed30 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1ed40 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b  rereq.        );
1ed50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 68  .        if( mTh
1ed60 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69  is>mPrev && mThi
1ed70 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20  s<mNext ) mNext 
1ed80 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d  = mThis;.      }
1ed90 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d  .      mPrev = m
1eda0 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Next;.      if( 
1edb0 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29  mNext==ALLBITS )
1edc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
1edd0 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c  ( mNext==mBest |
1ede0 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f  | mNext==mBestNo
1edf0 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  In ) continue;. 
1ee00 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1ee10 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1ee20 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c  lOne: mPrev=%04l
1ee30 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c  lx mNext=%04llx\
1ee40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ee50 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1ee60 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76  te3_uint64)mPrev
1ee70 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  , (sqlite3_uint6
1ee80 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  4)mNext));.     
1ee90 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1eea0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1eeb0 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1eec0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74  , mPrereq, mNext
1eed0 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20  |mPrereq, 0, p, 
1eee0 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1eef0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
1ef00 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20  prereq==mPrereq 
1ef10 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a  ){.        seenZ
1ef20 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ero = 1;.       
1ef30 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65   if( bIn==0 ) se
1ef40 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1ef50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ef60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c     /* If the cal
1ef70 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1ef80 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  () in the above 
1ef90 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e  loop did not fin
1efa0 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  d a plan.    ** 
1efb0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f  that requires no
1efc0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61   source tables a
1efd0 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20  t all (i.e. one 
1efe0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1eff0 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c  .    ** usable),
1f000 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72   make a call her
1f010 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63  e with all sourc
1f020 65 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65  e tables disable
1f030 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  d */.    if( rc=
1f040 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65  =SQLITE_OK && se
1f050 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20  enZero==0 ){.   
1f060 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f070 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1f080 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64  ne: all disabled
1f090 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1f0a0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1f0b0 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1f0c0 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1f0d0 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20  rereq, mPrereq, 
1f0e0 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  0, p, mNoOmit, &
1f0f0 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bIn);.      if( 
1f100 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72  bIn==0 ) seenZer
1f110 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d  oNoIN = 1;.    }
1f120 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1f130 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1f140 64 65 78 28 29 20 68 61 76 65 20 73 6f 20 66 61  dex() have so fa
1f150 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64  r failed to find
1f160 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74   a plan.    ** t
1f170 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20  hat requires no 
1f180 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74  source tables at
1f190 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f   all and does no
1f1a0 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29  t use an IN(...)
1f1b0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
1f1c0 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63  , make a final c
1f1d0 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e  all to obtain on
1f1e0 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20  e here.  */.    
1f1f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f200 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  K && seenZeroNoI
1f210 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48  N==0 ){.      WH
1f220 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1f230 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1f240 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  ll disabled and 
1f250 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20  w/o IN\n"));.   
1f260 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1f270 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1f280 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1f290 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1f2a0 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20  ereq, WO_IN, p, 
1f2b0 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1f2c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1f2d0 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
1f2e0 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
1f2f0 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a  ree(p->idxStr);.
1f300 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1f310 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  N(pParse->db, p)
1f320 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1f330 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61  x800, ("END %s.a
1f340 64 64 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d  ddVirtual(), rc=
1f350 25 64 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  %d\n", pSrc->pTa
1f360 62 2d 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a  b->zName, rc));.
1f370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f380 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f390 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1f3a0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  E */../*.** Add 
1f3b0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
1f3c0 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
1f3d0 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
1f3e0 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
1f3f0 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
1f400 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
1f410 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1f420 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c  pAddOr(.  WhereL
1f430 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1f440 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b  lder, .  Bitmask
1f450 20 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74   mPrereq, .  Bit
1f460 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29  mask mUnusable.)
1f470 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
1f480 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1f490 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
1f4a0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
1f4b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1f4c0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1f4d0 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
1f4e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f4f0 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
1f500 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
1f510 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
1f520 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
1f530 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
1f540 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73   sSum, sCur;.  s
1f550 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f560 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
1f570 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1f580 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  pWC;.  pWCEnd = 
1f590 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
1f5a0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
1f5b0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1f5c0 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
1f5d0 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
1f5e0 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
1f5f0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
1f600 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43  pNew->iTab;.  iC
1f610 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
1f620 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  sor;..  for(pTer
1f630 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
1f640 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
1f650 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
1f660 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
1f670 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1f680 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
1f690 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
1f6a0 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
1f6b0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
1f6c0 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
1f6d0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
1f6e0 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
1f6f0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1f700 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
1f710 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
1f720 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
1f730 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
1f740 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1f750 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
1f760 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1f770 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
1f780 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69    .      sSubBui
1f790 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
1f7a0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1f7b0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1f7c0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1f7d0 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20  rSet = &sCur;.. 
1f7e0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1f7f0 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70  0x200, ("Begin p
1f800 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
1f810 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
1f820 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  ));.      for(pO
1f830 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
1f840 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
1f850 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
1f860 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
1f870 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1f880 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
1f890 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1f8a0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
1f8b0 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
1f8c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1f8d0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1f8e0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
1f8f0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1f900 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
1f910 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
1f920 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
1f930 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
1f940 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
1f950 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
1f960 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
1f970 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1f980 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
1f990 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1f9a0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
1f9b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1f9d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
1f9e0 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
1f9f0 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  0;.#ifdef WHERET
1fa00 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
1fa10 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1fa20 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d  0x200, ("OR-term
1fa30 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64   %d of %p has %d
1fa40 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a   subterms:\n", .
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d     (int)(pOrTerm
1fa70 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72  -pOrWC->a), pTer
1fa80 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43  m, sSubBuild.pWC
1fa90 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  ->nTerm));.     
1faa0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
1fab0 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30  ereTrace & 0x400
1fac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1fad0 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
1fae0 50 72 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e  Print(sSubBuild.
1faf0 70 57 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pWC);.        }.
1fb00 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1fb10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1fb20 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
1fb30 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
1fb40 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
1fb50 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1fb60 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1fb70 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1fb80 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1fb90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
1fba0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
1fbb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fbc0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1fbd0 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50  e(&sSubBuild, mP
1fbe0 72 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20  rereq);.        
1fbf0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1fc00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fc10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1fc20 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53  ereLoopAddOr(&sS
1fc30 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71  ubBuild, mPrereq
1fc40 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1fc50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fc60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1fc70 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
1fc80 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1fc90 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
1fca0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1fcb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
1fcc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1fcd0 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
1fce0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1fcf0 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
1fd00 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
1fd10 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1fd20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fd30 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72    WhereOrSet sPr
1fd40 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ev;.          wh
1fd50 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76  ereOrMove(&sPrev
1fd60 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20  , &sSum);.      
1fd70 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
1fd80 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1fd90 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b  0; i<sPrev.n; i+
1fda0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1fdb0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e  for(j=0; j<sCur.
1fdc0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1fdd0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e         whereOrIn
1fde0 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65  sert(&sSum, sPre
1fdf0 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20  v.a[i].prereq | 
1fe00 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71  sCur.a[j].prereq
1fe10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1fe30 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1fe40 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
1fe50 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
1fe60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1fe80 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1fe90 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
1fea0 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
1feb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1fec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fed0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1fee0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1fef0 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
1ff00 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
1ff10 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
1ff20 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1ff30 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
1ff40 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1ff50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
1ff60 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1ff70 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
1ff80 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
1ff90 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
1ffa0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
1ffb0 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
1ffc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1ffd0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65  /* TUNING: Curre
1ffe0 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  ntly sSum.a[i].r
1fff0 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  Run is set to th
20000 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73  e sum of the cos
20010 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ts.        ** of
20020 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72   all sub-scans r
20030 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
20040 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c  R-scan. However,
20050 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67   due to rounding
20060 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
20070 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68  rs, it may be th
20080 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  at the cost of t
20090 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71  he OR-scan is eq
200a0 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20  ual to its.     
200b0 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e     ** most expen
200c0 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41  sive sub-scan. A
200d0 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  dd the smallest 
200e0 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79  possible penalty
200f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71   .        ** (eq
20100 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74  uivalent to mult
20110 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74  iplying the cost
20120 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73   by 1.07) to ens
20130 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20  ure that .      
20140 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e    ** this does n
20150 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72  ot happen. Other
20160 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20  wise, for WHERE 
20170 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20  clauses such as 
20180 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
20190 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74  ollowing where t
201a0 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
201b0 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20   on "y":.       
201c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
201d0 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68     WHERE likelih
201e0 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f  ood(x=?, 0.99) O
201f0 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a  R y=?.        **
20200 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
20210 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63  planner may elec
20220 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68  t to "OR" togeth
20230 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  er a full-table 
20240 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20  scan and an.    
20250 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f      ** index loo
20260 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73  kup. And other s
20270 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73  imilarly odd res
20280 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ults.  */.      
20290 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
202a0 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
202b0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
202c0 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
202d0 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
202e0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
202f0 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
20300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
20310 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
20320 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
20330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
20340 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
20350 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20  "End processing 
20360 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
20370 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a   pTerm));.    }.
20380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
203a0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
203b0 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
203c0 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
203d0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
203e0 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
203f0 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
20400 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
20410 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
20420 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
20430 20 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20   mPrereq = 0;.  
20440 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
20450 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
20460 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
20470 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
20480 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
20490 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
204a0 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53  Item;.  struct S
204b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e  rcList_item *pEn
204c0 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  d = &pTabList->a
204d0 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d  [pWInfo->nLevel]
204e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
204f0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
20500 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
20510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68   SQLITE_OK;.  Wh
20520 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
20530 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70   u8 priorJointyp
20540 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  e = 0;..  /* Loo
20550 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65  p over the table
20560 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66  s in the join, f
20570 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
20580 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42  t */.  pNew = pB
20590 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
205a0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e  whereLoopInit(pN
205b0 65 77 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  ew);.  pBuilder-
205c0 3e 69 50 6c 61 6e 4c 69 6d 69 74 20 3d 20 53 51  >iPlanLimit = SQ
205d0 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41 4e 4e  LITE_QUERY_PLANN
205e0 45 52 5f 4c 49 4d 49 54 3b 0a 20 20 66 6f 72 28  ER_LIMIT;.  for(
205f0 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
20600 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
20610 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70  <pEnd; iTab++, p
20620 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74  Item++){.    Bit
20630 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d  mask mUnusable =
20640 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54   0;.    pNew->iT
20650 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
20660 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69  Builder->iPlanLi
20670 6d 69 74 20 2b 3d 20 53 51 4c 49 54 45 5f 51 55  mit += SQLITE_QU
20680 45 52 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d 49  ERY_PLANNER_LIMI
20690 54 5f 49 4e 43 52 3b 0a 20 20 20 20 70 4e 65 77  T_INCR;.    pNew
206a0 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c  ->maskSelf = sql
206b0 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
206c0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
206d0 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
206e0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  or);.    if( ((p
206f0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
20700 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29  e|priorJointype)
20710 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
20720 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
20730 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69     /* This condi
20740 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65  tion is true whe
20750 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65 20 46  n pItem is the F
20760 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
20770 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  on the.      ** 
20780 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20  right-hand-side 
20790 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f  of a LEFT or CRO
207a0 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20  SS JOIN.  */.   
207b0 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d 50 72     mPrereq = mPr
207c0 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ior;.    }.    p
207d0 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70  riorJointype = p
207e0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
207f0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
20800 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
20810 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69  BLE.    if( IsVi
20820 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
20830 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  b) ){.      stru
20840 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20850 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
20860 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e  &pItem[1]; p<pEn
20870 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
20880 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c   if( mUnusable |
20890 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  | (p->fg.jointyp
208a0 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
208b0 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20  CROSS)) ){.     
208c0 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c       mUnusable |
208d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
208e0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
208f0 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72  MaskSet, p->iCur
20900 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sor);.        }.
20910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
20920 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
20930 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
20940 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
20950 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ble);.    }else.
20960 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
20970 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
20980 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20  LE */.    {.    
20990 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
209a0 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65  AddBtree(pBuilde
209b0 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20  r, mPrereq);.   
209c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
209d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 42 75 69  QLITE_OK && pBui
209e0 6c 64 65 72 2d 3e 70 57 43 2d 3e 68 61 73 4f 72  lder->pWC->hasOr
209f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
20a00 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
20a10 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
20a20 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
20a30 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
20a40 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
20a50 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
20a60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20a70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
20a80 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
20a90 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 69          /* We hi
20aa0 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  t the query plan
20ab0 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74  ner search limit
20ac0 20 73 65 74 20 62 79 20 69 50 6c 61 6e 4c 69 6d   set by iPlanLim
20ad0 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  it */.        sq
20ae0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
20af0 5f 57 41 52 4e 49 4e 47 2c 20 22 61 62 62 72 65  _WARNING, "abbre
20b00 76 69 61 74 65 64 20 71 75 65 72 79 20 61 6c 67  viated query alg
20b10 6f 72 69 74 68 6d 20 73 65 61 72 63 68 22 29 3b  orithm search");
20b20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20b30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
20b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72  else{.        br
20b50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20b60 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c   }.  }..  whereL
20b70 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
20b80 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
20b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
20ba0 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
20bb0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
20bc0 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
20bd0 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36  ereLoop of the 6
20be0 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
20bf0 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
20c00 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
20c10 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
20c20 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
20c30 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
20c40 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
20c50 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
20c60 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
20c70 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
20c80 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
20c90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
20ca0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
20cb0 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
20cc0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
20cd0 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
20ce0 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
20cf0 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
20d00 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
20d10 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
20d20 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
20d30 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
20d40 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
20d50 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
20d60 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
20d70 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
20d80 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
20d90 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
20da0 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
20db0 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
20dc0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
20dd0 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
20de0 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
20df0 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
20e00 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
20e10 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
20e20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
20e30 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
20e40 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
20e50 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
20e60 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
20e70 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
20e80 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
20e90 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
20ea0 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
20eb0 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
20ec0 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
20ed0 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
20ee0 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
20ef0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
20f00 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
20f10 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
20f20 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
20f30 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
20f40 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
20f50 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
20f60 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
20f70 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
20f80 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
20f90 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
20fa0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
20fb0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
20fc0 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
20fd0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
20fe0 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
20ff0 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
21000 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
21010 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
21020 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  * WHERE_GROUPBY 
21030 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f  or _DISTINCTBY o
21040 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  r _ORDERBY_LIMIT
21050 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
21060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21070 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
21080 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
21090 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
210a0 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
210b0 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
210c0 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
210d0 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
210e0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
210f0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
21100 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
21110 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
21120 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
21130 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
21140 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21150 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
21160 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
21170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21180 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
21190 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
211a0 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
211b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
211c0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
211d0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
211e0 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
211f0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
21200 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
21210 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
21220 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
21230 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
21240 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
21250 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
21260 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
21270 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
21280 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
21290 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
212a0 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f  use */.  u16 eqO
212b0 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f  pMask;         /
212c0 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69  * Allowed equali
212d0 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
212e0 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
212f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21300 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
21310 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
21320 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
21330 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
21340 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
21350 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
21360 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
21370 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
21380 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
21390 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
213a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
213b0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
213c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
213d0 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
213e0 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
213f0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21410 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
21420 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
21430 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21440 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
21450 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
21460 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
21470 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
21480 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
21490 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
214a0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
214b0 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
214c0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
214d0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
214e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
214f0 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
21500 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
21510 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
21520 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
21530 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
21540 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
21550 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
21560 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
21570 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
21580 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
21590 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
215a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
215b0 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
215c0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
215d0 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
215e0 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
215f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
21600 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
21610 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
21620 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
21630 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
21640 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
21650 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
21660 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
21670 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
21680 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
21690 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
216a0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
216b0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
216c0 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
216d0 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
216e0 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
216f0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
21700 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
21710 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
21720 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
21730 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
21740 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
21750 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
21760 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
21770 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
21780 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
21790 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
217a0 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
217b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
217c0 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
217d0 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
217e0 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
217f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
21800 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
21810 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
21820 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
21830 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
21840 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
21850 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
21860 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
21870 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
21880 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
21890 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
218a0 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
218b0 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
218c0 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
218d0 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
218e0 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
218f0 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
21900 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
21910 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
21920 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
21930 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
21940 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
21950 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
21960 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
21970 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
21980 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
21990 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
219a0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
219b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
219c0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
219d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
219e0 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
219f0 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
21a00 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
21a10 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
21a20 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
21a30 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
21a40 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
21a50 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
21a60 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
21a70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
21a80 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
21a90 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
21aa0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
21ab0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
21ac0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
21ad0 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
21ae0 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
21af0 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
21b00 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
21b10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
21b20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
21b30 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
21b40 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
21b50 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
21b60 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
21b70 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
21b80 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
21b90 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
21ba0 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
21bb0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
21bc0 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
21bd0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
21be0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
21bf0 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
21c00 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
21c10 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
21c20 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
21c30 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
21c40 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
21c50 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
21c60 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
21c70 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
21c80 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
21c90 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
21ca0 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
21cb0 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
21cc0 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
21cd0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
21ce0 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
21cf0 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
21d00 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
21d10 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
21d20 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f  .  eqOpMask = WO
21d30 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f  _EQ | WO_IS | WO
21d40 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77  _ISNULL;.  if( w
21d50 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21d60 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
21d70 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f  ) eqOpMask |= WO
21d80 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  _IN;.  for(iLoop
21d90 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
21da0 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
21db0 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
21dc0 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
21dd0 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
21de0 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
21df0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
21e00 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29  f( iLoop<nLoop )
21e10 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
21e20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
21e30 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77  op];.      if( w
21e40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21e50 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
21e60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f  }else{.      pLo
21e80 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  op = pLast;.    
21e90 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
21ea0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21eb0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
21ec0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
21ed0 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
21ee0 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
21ef0 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
21f00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21f10 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
21f20 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20  e.nIdxCol = 0;. 
21f30 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
21f40 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
21f50 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
21f60 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
21f70 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
21f80 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
21f90 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
21fa0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
21fb0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
21fc0 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
21fd0 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
21fe0 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
21ff0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
22000 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
22010 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
22020 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
22030 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
22040 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
22050 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
22060 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
22070 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
22080 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
22090 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
220a0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
220b0 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
220c0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
220d0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
220e0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
220f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22100 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
22110 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
22120 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
22130 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
22140 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
22150 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
22160 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71        ~ready, eq
22190 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  OpMask, 0);.    
221a0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
221b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
221c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
221d0 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a  rator==WO_IN ){.
221e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65          /* IN te
221f0 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  rms are only val
22200 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  id for sorting i
22210 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c  n the ORDER BY L
22220 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a  IMIT .        **
22230 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61   optimization, a
22240 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20  nd then only if 
22250 74 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c  they are actuall
22260 79 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  y used.        *
22270 2a 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70  * by the query p
22280 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  lan */.        a
22290 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
222a0 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
222b0 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  Y_LIMIT );.     
222c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
222d0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
222e0 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  Term!=pLoop->aLT
222f0 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20  erm[j]; j++){}. 
22300 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c         if( j>=pL
22310 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f  oop->nLTerm ) co
22320 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
22330 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
22340 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
22350 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
22360 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
22370 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
22380 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
22390 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70 57 49 6e  ollSeqMatch(pWIn
223a0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20  fo->pParse, .   
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
223c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
223d0 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  xpr, pTerm->pExp
223e0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
223f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
22410 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22420 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
22430 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
22440 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
22450 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
22460 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
22470 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
22480 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
22490 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
224a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
224b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
224c0 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
224d0 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
224e0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
224f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
22500 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
22510 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22520 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
22530 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
22540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
22550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22560 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
22570 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
22580 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
22590 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
225a0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
225b0 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
225c0 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
225d0 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
225e0 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
225f0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
22600 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
22610 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20  1]==XN_ROWID.   
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
22640 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
22650 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73  le));.        is
22660 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
22670 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
22680 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ndex);.      }..
22690 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
226a0 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e  rough all column
226b0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
226c0 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  nd deal with the
226d0 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74   ones.      ** t
226e0 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73  hat are not cons
226f0 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72  trained by == or
22700 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IN..      */.  
22710 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74      rev = revSet
22720 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74   = 0;.      dist
22730 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b  inctColumns = 0;
22740 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
22750 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  j<nColumn; j++){
22760 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63  .        u8 bOnc
22770 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20 74  e = 1; /* True t
22780 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
22790 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
227a0 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  /..        asser
227b0 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  t( j>=pLoop->u.b
227c0 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20 20 20  tree.nEq .      
227d0 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
227e0 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d  >aLTerm[j]==0)==
227f0 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29  (j<pLoop->nSkip)
22800 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
22810 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
22820 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26 26 20  >u.btree.nEq && 
22830 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20  j>=pLoop->nSkip 
22840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 31 36  ){.          u16
22850 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c   eOp = pLoop->aL
22860 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74  Term[j]->eOperat
22870 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  or;..          /
22880 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
22890 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c  nd IS and ISNULL
228a0 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73   terms.  (Also s
228b0 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77 68 65  kip IN terms whe
228c0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  n.          ** d
228d0 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44 45 52  oing WHERE_ORDER
228e0 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65 73 73  BY_LIMIT process
228f0 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20 20 20  ing). .         
22900 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
22910 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
22920 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e  term is a column
22930 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e   of an ((?,?) IN
22940 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20   (SELECT...)) . 
22950 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
22960 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68  ession for which
22970 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
22980 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  rns more than on
22990 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  e column,.      
229a0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74 68 61      ** check tha
229b0 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  t it is the only
229c0 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62 79 20   column used by 
229d0 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72  this loop. Other
229e0 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  wise,.          
229f0 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e 65 20  ** if it is one 
22a00 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20  of two or more, 
22a10 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  none of the colu
22a20 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20 20 20  mns can be.     
22a30 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72       ** consider
22a40 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f  ed to match an O
22a50 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20 20 2a  RDER BY term.  *
22a60 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
22a70 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73 6b 29  (eOp & eqOpMask)
22a80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
22a90 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
22aa0 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
22ab0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22ac0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
22ad0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
22ae0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
22af0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
22b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22b10 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
22b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22b30 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26 20 57  ( ALWAYS(eOp & W
22b40 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  O_IN) ){.       
22b50 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53 28 29       /* ALWAYS()
22b60 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 3a 20   justification: 
22b70 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61 6c 69  eOp is an equali
22b80 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75 65 20  ty operator due 
22b90 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
22ba0 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75     ** j<pLoop->u
22bb0 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74  .btree.nEq const
22bc0 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e  raint above.  An
22bd0 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68 65 72  y equality other
22be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22bf0 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61  than WO_IN is ca
22c00 70 74 75 72 65 64 20 62 79 20 74 68 65 20 70 72  ptured by the pr
22c10 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20 53 6f  evious "if".  So
22c20 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20 20 20   this one.      
22c30 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
22c40 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e  has to be WO_IN.
22c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22c60 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70  Expr *pX = pLoop
22c70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78  ->aLTerm[j]->pEx
22c80 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
22c90 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f  for(i=j+1; i<pLo
22ca0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
22cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
22cc0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
22cd0 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72  aLTerm[i]->pExpr
22ce0 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ==pX ){.        
22cf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22d00 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69  (pLoop->aLTerm[i
22d10 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  ]->eOperator & W
22d20 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20  O_IN) );.       
22d30 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d           bOnce =
22d40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22d50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22d60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
22d90 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74          /* Get t
22da0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
22db0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69   in the table (i
22dc0 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74  Column) and sort
22dd0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
22de0 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74  * (revIdx) for t
22df0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he j-th column o
22e00 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  f the index..   
22e10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22e20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
22e30 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
22e40 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
22e50 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
22e60 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
22e70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
22e80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22e90 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
22ea0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
22eb0 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57  iColumn = XN_ROW
22ec0 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
22ed0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
22ee0 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
22ef0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
22f00 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
22f10 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
22f20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
22f30 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
22f40 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
22f50 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
22f60 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
22f70 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
22f80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22f90 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
22fa0 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
22fb0 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
22fc0 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
22fd0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
22fe0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
22ff0 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
23000 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
23010 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
23020 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
23030 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
23040 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23050 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
23060 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
23070 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
23080 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
23090 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
230a0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72  he index and mar
230b0 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
230c0 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
230d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d    */.        isM
230e0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
230f0 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
23100 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
23110 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
23120 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
23130 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
23140 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
23150 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23160 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
23170 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
23180 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pr);.          t
23190 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
231a0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
231b0 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  PBY );.         
231c0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
231d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
231e0 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20  STINCTBY );.    
231f0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
23200 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47  Flags & (WHERE_G
23210 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53  ROUPBY|WHERE_DIS
23220 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62  TINCTBY))==0 ) b
23230 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
23240 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
23250 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  =XN_ROWID ){.   
23260 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
23270 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
23280 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
23290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
232a0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
232b0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
232c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
232d0 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
232e0 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
232f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23310 20 20 20 20 20 45 78 70 72 20 2a 70 49 64 78 45       Expr *pIdxE
23320 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43  xpr = pIndex->aC
23330 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
23340 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
23350 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
23360 6f 6d 70 61 72 65 53 6b 69 70 28 70 4f 42 45 78  ompareSkip(pOBEx
23370 70 72 2c 20 70 49 64 78 45 78 70 72 2c 20 69 43  pr, pIdxExpr, iC
23380 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ur) ){.         
23390 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
233a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
233b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
233c0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 21 3d     if( iColumn!=
233d0 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  XN_ROWID ){.    
233e0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
233f0 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
23400 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
23410 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
23420 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
23430 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
23440 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
23450 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ->zName, pIndex-
23460 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
23470 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23490 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
234a0 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20  nIdxCol = j+1;. 
234b0 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
234c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
234d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
234e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
234f0 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c  atch && (wctrlFl
23500 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
23510 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
23520 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
23530 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  e the sort order
23540 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69   is compatible i
23550 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
23560 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  ause..          
23570 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
23580 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
23590 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
235a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
235b0 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
235c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
235d0 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
235e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
235f0 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68  tOrder ) isMatch
23600 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23620 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
23630 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
23640 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
23650 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
23660 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
23670 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
23680 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
23690 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
236a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
236b0 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
236c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
236d0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ( iColumn==XN_RO
236e0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  WID ){.         
236f0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
23700 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
23710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
23720 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
23730 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
23740 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
23750 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
23760 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23770 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61          /* No ma
23780 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  tch found */.   
23790 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
237a0 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a  || j<nKeyCol ){.
237b0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
237c0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
237d0 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  tinct!=0 );.    
237e0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
237f0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
23800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23820 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
23830 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
23840 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
23850 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
23860 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20  inctColumns ){. 
23870 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23880 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
23890 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
238a0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
238b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
238c0 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20  } /* end-if not 
238d0 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20  one-row */..    
238e0 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
238f0 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74  other ORDER BY t
23900 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65  erms that refere
23910 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20  nce pLoop */.   
23920 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
23930 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72  inct ){.      or
23940 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
23950 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
23960 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lf;.      for(i=
23970 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
23980 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
23990 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69  r *p;.        Bi
239a0 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20  tmask mTerm;.   
239b0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
239c0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
239d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
239e0 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
239f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
23a00 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    mTerm = sqlite
23a10 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28  3WhereExprUsage(
23a20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
23a30 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t,p);.        if
23a40 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73  ( mTerm==0 && !s
23a50 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
23a60 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e  tant(p) ) contin
23a70 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
23a80 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73  (mTerm&~orderDis
23a90 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b  tinctMask)==0 ){
23aa0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
23ab0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
23ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ad0 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  }.    }.  } /* E
23ae0 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72  nd the loop over
23af0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20   all WhereLoops 
23b00 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20  from outer-most 
23b10 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f  down to inner-mo
23b20 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61  st */.  if( obSa
23b30 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75  t==obDone ) retu
23b40 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b  rn (i8)nOrderBy;
23b50 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44  .  if( !isOrderD
23b60 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66  istinct ){.    f
23b70 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b  or(i=nOrderBy-1;
23b80 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
23b90 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41    Bitmask m = MA
23ba0 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20  SKBIT(i) - 1;.  
23bb0 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d      if( (obSat&m
23bc0 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b  )==m ) return i;
23bd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
23be0 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
23bf0 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n -1;.}.../*.** 
23c00 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  If the WHERE_GRO
23c10 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
23c20 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73   in the mask pas
23c30 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
23c40 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74  ereBegin(),.** t
23c50 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d  he planner assum
23c60 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65 63  es that the spec
23c70 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c  ified pOrderBy l
23c80 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ist is actually 
23c90 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c  a GROUP.** BY cl
23ca0 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e  ause - and so an
23cb0 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f  y order that gro
23cc0 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71 75  ups rows as requ
23cd0 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20 74  ired satisfies t
23ce0 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a  he.** request..*
23cf0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
23d00 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
23d10 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
23d20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  or the caller to
23d30 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
23d40 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
23d50 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79   rows are really
23d60 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64   being delivered
23d70 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
23d80 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20  , or.** just in 
23d90 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72  some other order
23da0 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74   that provides t
23db0 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f 75  he required grou
23dc0 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ping. However,.*
23dd0 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 53  * if the WHERE_S
23de0 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20  ORTBYGROUP flag 
23df0 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74  is also passed t
23e00 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23e10 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  gin(), then.** t
23e20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
23e30 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   be called on th
23e40 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65  e returned Where
23e50 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20  Info object. It 
23e60 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20  returns.** true 
23e70 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c  if the rows real
23e80 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65  ly will be sorte
23e90 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  d in the specifi
23ea0 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c  ed order, or fal
23eb0 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  se.** otherwise.
23ec0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
23ed0 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a  le, assuming:.**
23ee0 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
23ef0 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59  EX i1 ON t1(x, Y
23f00 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a  );.**.** then.**
23f10 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
23f20 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
23f30 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79  x,y ORDER BY x,y
23f40 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
23f50 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54  )==1.**   SELECT
23f60 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
23f70 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59   BY y,x ORDER BY
23f80 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72   y,x;   -- IsSor
23f90 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20  ted()==0.*/.int 
23fa0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
23fb0 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  rted(WhereInfo *
23fc0 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72  pWInfo){.  asser
23fd0 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  t( pWInfo->wctrl
23fe0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
23ff0 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72  OUPBY );.  asser
24000 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  t( pWInfo->wctrl
24010 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
24020 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72  RTBYGROUP );.  r
24030 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f  eturn pWInfo->so
24040 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rted;.}..#ifdef 
24050 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
24060 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
24070 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
24080 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
24090 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
240a0 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
240b0 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
240c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
240d0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
240e0 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
240f0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
24100 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
24110 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
24120 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
24130 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
24140 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
24150 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
24160 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
24170 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
24180 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
24190 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
241a0 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73  ng nRow rows, as
241b0 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
241c0 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f  keys have .** nO
241d0 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61  rderby columns a
241e0 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  nd that the firs
241f0 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e  t nSorted column
24200 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
24210 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  .** order..*/.st
24220 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
24230 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
24240 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
24250 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77  o,.  LogEst nRow
24260 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ,.  int nOrderBy
24270 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a  ,.  int nSorted.
24280 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ){.  /* TUNING: 
24290 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
242a0 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61  f a full externa
242b0 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20  l sort, where N 
242c0 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d  is .  ** the num
242d0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73  ber of rows to s
242e0 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ort is:.  **.  *
242f0 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
24300 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20  * N * log(N)).. 
24310 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66   ** .  ** Or, if
24320 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c   the order-by cl
24330 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73  ause has X terms
24340 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61   but only the la
24350 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73  st Y .  ** terms
24360 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65   are out of orde
24370 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f  r, then block-so
24380 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63  rting will reduc
24390 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74  e the .  ** sort
243a0 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a  ing cost to:.  *
243b0 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
243c0 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
243d0 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a  )) * (Y/X).  **.
243e0 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74    ** The (Y/X) t
243f0 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  erm is implement
24400 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76  ed using stack v
24410 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20  ariable rScale. 
24420 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20   ** below.  */. 
24430 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20   LogEst rScale, 
24440 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73  rSortCost;.  ass
24450 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20  ert( nOrderBy>0 
24460 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  && 66==sqlite3Lo
24470 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72  gEst(100) );.  r
24480 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c  Scale = sqlite3L
24490 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d  ogEst((nOrderBy-
244a0 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72  nSorted)*100/nOr
244b0 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72  derBy) - 66;.  r
244c0 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20  SortCost = nRow 
244d0 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a  + rScale + 16;..
244e0 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79    /* Multiple by
244f0 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20   log(M) where M 
24500 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24510 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20   output rows..  
24520 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54  ** Use the LIMIT
24530 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20   for M if it is 
24540 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28  smaller */.  if(
24550 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
24560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
24570 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57  _LIMIT)!=0 && pW
24580 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f  Info->iLimit<nRo
24590 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20  w ){.    nRow = 
245a0 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a  pWInfo->iLimit;.
245b0 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20    }.  rSortCost 
245c0 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b  += estLog(nRow);
245d0 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43  .  return rSortC
245e0 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ost;.}../*.** Gi
245f0 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
24600 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24610 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
24620 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
24630 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
24640 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
24650 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
24660 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
24670 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
24680 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
24690 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
246a0 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
246b0 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
246c0 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
246d0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
246e0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
246f0 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
24700 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
24710 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
24720 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
24730 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
24740 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
24750 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
24760 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
24770 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24780 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
24790 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
247a0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
247b0 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
247c0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
247d0 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
247e0 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
247f0 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
24800 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
24810 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
24820 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
24830 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
24840 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
24850 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
24860 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
24870 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
24880 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
24890 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
248a0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
248b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
248c0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
248d0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
248e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
248f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
24900 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
24910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24920 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
24930 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
24940 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
24950 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
24960 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
24970 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
24980 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
24990 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
249a0 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
249b0 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74  replace */.  int
249c0 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
249d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
249e0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61   of ORDER BY cla
249f0 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c  use terms */.  L
24a00 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  ogEst mxCost = 0
24a10 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
24a20 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
24a30 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
24a40 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65  LogEst mxUnsorte
24a50 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78  d = 0;    /* Max
24a60 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f  imum unsorted co
24a70 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
24a80 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ath */.  int nTo
24a90 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
24aa0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24ab0 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
24ac0 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
24ad0 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
24ae0 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
24af0 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
24b00 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
24b10 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
24b20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
24b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24b40 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
24b50 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
24b60 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
24b70 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
24b80 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
24b90 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
24ba0 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
24bb0 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
24bc0 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
24bd0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
24be0 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
24bf0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
24c00 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
24c10 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
24c20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
24c30 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
24c40 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
24c50 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
24c60 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
24c70 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
24c80 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ory */.  LogEst 
24c90 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20  *aSortCost = 0; 
24ca0 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e     /* Sorting an
24cb0 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e  d partial sortin
24cc0 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61  g costs */.  cha
24cd0 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
24ce0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
24cf0 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
24d00 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
24d10 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  */.  int nSpace;
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d30 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
24d40 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53   allocated at pS
24d50 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  pace */..  pPars
24d60 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
24d70 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
24d80 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
24d90 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
24da0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
24db0 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
24dc0 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
24dd0 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
24de0 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
24df0 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
24e00 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
24e10 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
24e20 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
24e30 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
24e40 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
24e50 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
24e60 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31  = (nLoop<=1) ? 1
24e70 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
24e80 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
24e90 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
24ea0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
24eb0 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
24ec0 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
24ed0 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52  gin solver.  (nR
24ee0 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52  owEst=%d)\n", nR
24ef0 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49  owEst));..  /* I
24f00 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72  f nRowEst is zer
24f10 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  o and there is a
24f20 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
24f30 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e  e, ignore it. In
24f40 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20   this.  ** case 
24f50 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  the purpose of t
24f60 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65  his call is to e
24f70 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
24f80 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72  er of rows retur
24f90 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ned.  ** by the 
24fa0 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f  overall query. O
24fb0 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74  nce this estimat
24fc0 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  e has been obtai
24fd0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a  ned, the caller.
24fe0 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65    ** will invoke
24ff0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
25000 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61   second time, pa
25010 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61  ssing the estima
25020 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e  te as the.  ** n
25030 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72  RowEst parameter
25040 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
25050 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
25060 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
25070 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
25080 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
25090 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  nOrderBy = pWInf
250a0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
250b0 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  pr;.  }..  /* Al
250c0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
250d0 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
250e0 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61  aTo, aFrom and a
250f0 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20  SortCost[] */.  
25100 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66  nSpace = (sizeof
25110 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
25120 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
25130 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
25140 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69  ;.  nSpace += si
25150 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
25160 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63  OrderBy;.  pSpac
25170 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
25180 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70  locRawNN(db, nSp
25190 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61  ace);.  if( pSpa
251a0 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
251b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
251c0 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65  ;.  aTo = (Where
251d0 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20  Path*)pSpace;.  
251e0 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68  aFrom = aTo+mxCh
251f0 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61  oice;.  memset(a
25200 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  From, 0, sizeof(
25210 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58  aFrom[0]));.  pX
25220 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29   = (WhereLoop**)
25230 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29  (aFrom+mxChoice)
25240 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f  ;.  for(ii=mxCho
25250 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f  ice*2, pFrom=aTo
25260 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46  ; ii>0; ii--, pF
25270 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f  rom++, pX += nLo
25280 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  op){.    pFrom->
25290 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a  aLoop = pX;.  }.
252a0 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
252b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
252c0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
252d0 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69   clause and it i
252e0 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f  s not being igno
252f0 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20  red, set up.    
25300 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
25310 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72   aSortCost[] arr
25320 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74  ay. Each element
25330 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73   of the aSortCos
25340 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69  t array.    ** i
25350 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20  s either zero - 
25360 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e  meaning it has n
25370 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74  ot yet been init
25380 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65  ialized - or the
25390 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20  .    ** cost of 
253a0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20  sorting nRowEst 
253b0 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65  rows of data whe
253c0 72 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74  re the first X t
253d0 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  erms of.    ** t
253e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
253f0 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  se are already i
25400 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58  n order, where X
25410 20 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20   is the array . 
25420 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f     ** index.  */
25430 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d  .    aSortCost =
25440 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20   (LogEst*)pX;.  
25450 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f    memset(aSortCo
25460 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f  st, 0, sizeof(Lo
25470 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
25480 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
25490 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c   aSortCost==0 ||
254a0 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d   &pSpace[nSpace]
254b0 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43  ==(char*)&aSortC
254c0 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b  ost[nOrderBy] );
254d0 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
254e0 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61  Cost!=0 || &pSpa
254f0 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
25500 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53  r*)pX );..  /* S
25510 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77  eed the search w
25520 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65  ith a single Whe
25530 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e  rePath containin
25540 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70  g zero WhereLoop
25550 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e  s..  **.  ** TUN
25560 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20  ING: Do not let 
25570 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74  the number of it
25580 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76  erations go abov
25590 65 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f  e 28.  If the co
255a0 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75  st.  ** of compu
255b0 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ting an automati
255c0 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70  c index is not p
255d0 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20  aid back within 
255e0 74 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a  the first 28.  *
255f0 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20  * rows, then do 
25600 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f  not use the auto
25610 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a  matic index. */.
25620 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20    aFrom[0].nRow 
25630 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51  = MIN(pParse->nQ
25640 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20  ueryLoop, 48);  
25650 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69  assert( 48==sqli
25660 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b  te3LogEst(28) );
25670 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20  .  nFrom = 1;.  
25680 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d  assert( aFrom[0]
25690 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b  .isOrdered==0 );
256a0 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20  .  if( nOrderBy 
256b0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f  ){.    /* If nLo
256c0 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  op is zero, then
256d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52   there are no FR
256e0 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  OM terms in the 
256f0 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20  query. Since.   
25700 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
25710 20 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72   the query may r
25720 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20  eturn a maximum 
25730 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20  of one row, the 
25740 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61  results.    ** a
25750 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
25760 65 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65  e requested orde
25770 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64  r. Set isOrdered
25780 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a   to nOrderBy to.
25790 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20      ** indicate 
257a0 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f  this. Or, if nLo
257b0 6f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  op is greater th
257c0 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f  an zero, set isO
257d0 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a  rdered to.    **
257e0 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
257f0 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
25800 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  set may or may n
25810 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a  ot be ordered, .
25820 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67      ** depending
25830 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64   on the loops ad
25840 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
25850 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20  nt plan.  */.   
25860 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
25870 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20  red = nLoop>0 ? 
25880 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  -1 : nOrderBy;. 
25890 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
258a0 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
258b0 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
258c0 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
258d0 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
258e0 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
258f0 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
25900 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
25910 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
25920 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
25930 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
25940 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
25950 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
25960 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
25970 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
25980 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
25990 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
259a0 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
259b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
259c0 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
259d0 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
259e0 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
259f0 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
25a00 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20    LogEst nOut;  
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69      /* Rows visi
25a30 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57  ted by (pFrom+pW
25a40 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
25a50 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20   LogEst rCost;  
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a70 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61     /* Cost of pa
25a80 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  th (pFrom+pWLoop
25a90 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67  ) */.        Log
25aa0 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20  Est rUnsorted;  
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ac0 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  * Unsorted cost 
25ad0 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  of (pFrom+pWLoop
25ae0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20  ) */.        i8 
25af0 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f  isOrdered = pFro
25b00 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f  m->isOrdered;  /
25b10 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20  * isOrdered for 
25b20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
25b30 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
25b40 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20  k maskNew;      
25b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
25b60 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74  ask of src visit
25b70 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20  ed by (..) */.  
25b80 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
25b90 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20  vMask = 0;      
25ba0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
25bb0 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f  of rev-order loo
25bc0 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a  ps for (..) */..
25bd0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
25be0 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70  oop->prereq & ~p
25bf0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
25c00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
25c10 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
25c20 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70  op->maskSelf & p
25c30 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
25c40 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
25c50 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
25c60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
25c70 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
25c80 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f  =0 && pFrom->nRo
25c90 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w<3 ){.         
25ca0 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61   /* Do not use a
25cb0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
25cc0 78 20 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f  x if the this lo
25cd0 6f 70 20 69 73 20 65 78 70 65 63 74 65 64 0a 20  op is expected. 
25ce0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72           ** to r
25cf0 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 32  un less than 1.2
25d00 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69 73 20  5 times.  It is 
25d10 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 73 6f  tempting to also
25d20 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20 20 20   exclude.       
25d30 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
25d40 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e 20 61  index usage on a
25d50 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 62 75  n outer loop, bu
25d60 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e 20 61  t sometimes an a
25d70 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20 20 20  utomatic.       
25d80 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 75     ** index is u
25d90 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f 75 74  seful in the out
25da0 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63 6f 72  er loop of a cor
25db0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
25dc0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
25dd0 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
25de0 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
25df0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25e00 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  e;.        }..  
25e10 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
25e20 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
25e30 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
25e40 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
25e50 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
25e60 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
25e70 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
25e80 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
25e90 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
25ea0 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
25eb0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
25ec0 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
25ed0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
25ee0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
25ef0 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
25f00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
25f10 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
25f20 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
25f30 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
25f40 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
25f50 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
25f60 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
25f70 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
25f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
25f90 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
25fa0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
25fb0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fd0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
25fe0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
25ff0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
26020 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
26030 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26040 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
26050 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
26060 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
26070 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
26080 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
26090 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
260a0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
260b0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
260c0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
260d0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
260e0 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
260f0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
26110 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
26120 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
26130 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
26140 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26150 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
26160 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c 20 65  :  Add a small e
26170 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28 35 29  xtra penalty (5)
26180 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73 20 61   to sorting as a
26190 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  n.          ** e
261a0 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d 65 6e  xtra encouragmen
261b0 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  t to the query p
261c0 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65 63 74  lanner to select
261d0 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20 20 20   a plan.        
261e0 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 72    ** where the r
261f0 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20 74 68  ows emerge in th
26200 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20  e correct order 
26210 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f 72 74  without any sort
26220 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
26230 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
26240 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
26250 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
26260 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72  (rUnsorted, aSor
26270 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
26280 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20 20 20  ) + 5;..        
26290 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
262a0 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
262b0 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f    ("---- sort co
262c0 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20  st=%-3d (%d/%d) 
262d0 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25  increases cost %
262e0 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20  3d to %-3d\n",. 
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
26300 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
26310 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73  d], (nOrderBy-is
26320 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72  Ordered), nOrder
26330 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  By, .           
26340 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72      rUnsorted, r
26350 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Cost));.        
26360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26370 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74   rCost = rUnsort
26380 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 72 55  ed;.          rU
26390 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20 2f  nsorted -= 2;  /
263a0 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67 68  * TUNING:  Sligh
263b0 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f 72 20  t bias in favor 
263c0 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e 73  of no-sort plans
263d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   */.        }.. 
263e0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
263f0 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70  to see if pWLoop
26400 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64   should be added
26410 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20   to the set of. 
26420 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69         ** mxChoi
26430 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ce best-so-far p
26440 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  aths..        **
26450 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73  .        ** Firs
26460 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  t look for an ex
26470 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e  isting path amon
26480 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
26490 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ths.        ** t
264a0 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73  hat covers the s
264b0 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
264c0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
264d0 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  e isOrdered.    
264e0 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
264f0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  s the current pa
26500 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20  th candidate..  
26510 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26520 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28   ** The term "((
26530 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
26540 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
26550 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e  =0" is equivalen
26560 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  t.        ** to 
26570 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d  (pTo->isOrdered=
26580 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72  =(-1))==(isOrder
26590 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74  ed==(-1))" for t
265a0 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  he range.       
265b0 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c   ** of legal val
265c0 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65  ues for isOrdere
265d0 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20  d, -1..64..     
265e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
265f0 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
26600 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
26610 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
26620 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
26630 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
26640 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
26650 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
26660 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20  ered)&0x80)==0. 
26670 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
26680 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26690 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20  ( jj==nTo-1 );. 
266a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
266b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
266c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
266d0 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20  if( jj>=nTo ){. 
266e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65           /* None
266f0 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
26700 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
26710 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e  hs match the can
26720 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  didate. */.     
26730 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
26740 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
26750 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f    && (rCost>mxCo
26760 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78  st || (rCost==mx
26770 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65  Cost && rUnsorte
26780 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a  d>=mxUnsorted)).
26790 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
267a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
267b0 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74  current candidat
267c0 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74  e is no better t
267d0 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d  han any of the m
267e0 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
267f0 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72      ** paths cur
26800 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65  rently in the be
26810 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72  st-so-far buffer
26820 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20  .  So discard.  
26830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
26840 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e  s candidate as n
26850 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69  ot viable. */.#i
26860 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
26870 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
26880 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
26890 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
268a0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
268b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
268c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
268d0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
268e0 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
268f0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
26900 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
26910 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
26920 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
26930 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72  st, nOut, rUnsor
26940 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26950 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
26960 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
26970 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
26980 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
26990 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
269a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
269b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
269c0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
269d0 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73   points it means
269e0 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61   that the new ca
269f0 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20  ndidate path.   
26a00 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20         ** needs 
26a10 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
26a20 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73  he set of best-s
26a30 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a  o-far paths. */.
26a40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
26a50 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  o<mxChoice ){.  
26a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
26a70 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
26a80 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79  f the aTo set by
26a90 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20   one */.        
26aa0 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a      jj = nTo++;.
26ab0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
26ad0 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65  New path replace
26ae0 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73  s the prior wors
26af0 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20  t to keep count 
26b00 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a  below mxChoice *
26b10 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
26b20 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20   = mxI;.        
26b30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
26b40 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
26b50 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
26b60 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
26b70 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
26b80 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
26b90 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
26ba0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26bb0 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
26bc0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
26bd0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
26be0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26bf0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
26c00 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
26c10 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
26c20 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26c40 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
26c50 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26c60 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
26c70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
26c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26c90 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
26ca0 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d  es here if best-
26cb0 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d  so-far path pTo=
26cc0 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74  aTo[jj] covers t
26cd0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
26ce0 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
26cf0 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
26d00 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73 65 74  me isOrdered set
26d10 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20  ting as the.    
26d20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61        ** candida
26d30 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20  te path.  Check 
26d40 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61  to see if the ca
26d50 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72  ndidate should r
26d60 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20  eplace.         
26d70 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68   ** pTo or if th
26d80 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75  e candidate shou
26d90 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  ld be skipped.. 
26da0 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20           ** .   
26db0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f         ** The co
26dc0 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e 20  nditional is an 
26dd0 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f 72 20  expanded vector 
26de0 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75 69 76  comparison equiv
26df0 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20 20  alent to:.      
26e00 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e 72      **   (pTo->r
26e10 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70  Cost,pTo->nRow,p
26e20 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20 3c  To->rUnsorted) <
26e30 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72 55  = (rCost,nOut,rU
26e40 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20  nsorted).       
26e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
26e60 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
26e70 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  Cost .          
26e80 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
26e90 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20 20 20  =rCost.         
26ea0 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d 3e 6e        && (pTo->n
26eb0 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20 20  Row<nOut.       
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
26ed0 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20  pTo->nRow==nOut 
26ee0 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
26ef0 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20 20  d<=rUnsorted).  
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
26f20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 23  ).          ){.#
26f30 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
26f40 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
26f50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
26f60 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26f70 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
26f80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26f90 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fb0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
26fc0 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
26fd0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
26fe0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
26ff0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
27000 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
27010 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
27020 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
27030 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
27040 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
27050 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
27060 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27070 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27080 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
27090 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
270a0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
270b0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
270c0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
270d0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
270e0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
270f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27100 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
27110 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
27120 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
27130 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
27140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27150 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
27160 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
27170 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
27180 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f   from further co
27190 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
271a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
271b0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
271c0 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
271d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
271e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
271f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27200 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
27210 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
27220 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
27230 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20  hes here if the 
27240 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69  candidate path i
27250 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  s better than th
27260 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
27270 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63  To path.  Replac
27280 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63  e pTo with the c
27290 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66  andidate. */.#if
272a0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
272b0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
272c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
272d0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
272e0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
272f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27300 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
27310 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
27320 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
27330 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
27360 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
27370 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
27380 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20  , rUnsorted,.   
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
273a0 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
273b0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
273c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
273d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
273e0 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
273f0 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
27400 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
27410 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
27420 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
27430 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
27440 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
27450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27460 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c   pTo->rUnsorted,
27470 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
27480 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
27490 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
274a0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
274b0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
274c0 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
274d0 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
274e0 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
274f0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
27500 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
27510 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
27520 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
27530 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
27540 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
27550 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
27560 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
27570 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
27580 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
27590 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
275a0 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
275b0 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
275c0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
275d0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
275e0 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
275f0 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
27600 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
27610 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
27620 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
27630 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
27640 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
27650 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
27660 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
27670 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
27680 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
27690 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
276a0 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
276b0 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
276c0 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
276d0 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
276e0 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
276f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
27700 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
27710 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
27720 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
27730 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
27740 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
27750 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
27760 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27770 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
27780 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
27790 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
277a0 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
277b0 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
277c0 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
277d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
277e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
277f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27800 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
27810 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
27820 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
27830 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27840 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
27850 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27860 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
27870 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
27880 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
27890 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
278a0 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
278b0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
278c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
278d0 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
278e0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
278f0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
27900 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
27910 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
27920 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
27930 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
27940 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
27950 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
27960 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
27970 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
27980 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
27990 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
279a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
279b0 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
279c0 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
279d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
279e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
279f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27a00 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
27a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
27a20 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
27a30 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
27a40 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
27a50 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
27a60 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
27a70 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
27a80 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
27a90 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
27aa0 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
27ab0 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
27ac0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
27ad0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27ae0 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
27af0 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
27b00 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
27b10 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
27b20 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27b30 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
27b40 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
27b50 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
27b60 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
27b70 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
27b80 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
27b90 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31  From;.  for(ii=1
27ba0 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
27bb0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
27bc0 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69  ->rCost>aFrom[ii
27bd0 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20  ].rCost ) pFrom 
27be0 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20  = &aFrom[ii];.  
27bf0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  }.  assert( pWIn
27c00 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f  fo->nLevel==nLoo
27c10 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  p );.  /* Load t
27c20 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
27c30 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20  ath into pWInfo 
27c40 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
27c50 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
27c60 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Loop++){.    Whe
27c70 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
27c80 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c  = pWInfo->a + iL
27c90 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  oop;.    pLevel-
27ca0 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70  >pWLoop = pWLoop
27cb0 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
27cc0 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76  iLoop];.    pLev
27cd0 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f  el->iFrom = pWLo
27ce0 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c  op->iTab;.    pL
27cf0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
27d00 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
27d10 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
27d20 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
27d30 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
27d40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27d50 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
27d60 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  !=0.   && (pWInf
27d70 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
27d80 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
27d90 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66  )==0.   && pWInf
27da0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
27db0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
27dc0 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  P.   && nRowEst.
27dd0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
27de0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
27df0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
27e00 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
27e10 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
27e20 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72  >pResultSet, pFr
27e30 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
27e40 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
27e50 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
27e60 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
27e70 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
27e80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
27e90 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
27ea0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
27eb0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
27ec0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
27ed0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
27ee0 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
27ef0 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
27f00 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  op = 0;.  if( pW
27f10 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
27f20 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
27f30 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
27f40 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
27f50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  ){.      if( pFr
27f60 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70  om->isOrdered==p
27f70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
27f80 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
27f90 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
27fa0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
27fb0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
27fc0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
27fd0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
27fe0 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69  OBSat = pFrom->i
27ff0 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
28000 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
28010 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
28020 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
28030 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b  fo->nOBSat<=0 ){
28040 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
28050 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20  >nOBSat = 0;.   
28060 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30       if( nLoop>0
28070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
28080 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f  2 wsFlags = pFro
28090 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
280a0 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ]->wsFlags;.    
280b0 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
280c0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
280d0 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  W)==0 .         
280e0 20 20 26 26 20 28 77 73 46 6c 61 67 73 26 28 57    && (wsFlags&(W
280f0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43  HERE_IPK|WHERE_C
28100 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45  OLUMN_IN))!=(WHE
28110 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c  RE_IPK|WHERE_COL
28120 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20  UMN_IN).        
28130 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
28140 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
28150 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
28160 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
28170 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
28180 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
28190 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a  OrderBy, pFrom,.
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45        WHERE_ORDE
281c0 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70  RBY_LIMIT, nLoop
281d0 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
281e0 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a  [nLoop-1], &m);.
281f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
28200 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
28210 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20  WHERE_IPK );.   
28220 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
28230 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  e( wsFlags & WHE
28240 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a  RE_COLUMN_IN );.
28250 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28260 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  rc==pWInfo->pOrd
28270 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
28290 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  nfo->bOrderedInn
282a0 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20  erLoop = 1;.    
282b0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
282c0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20  ->revMask = m;. 
282d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
282e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
282f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28300 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
28310 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
28320 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
28330 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49  ).        && pWI
28340 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49  nfo->nOBSat==pWI
28350 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
28360 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a  Expr && nLoop>0.
28370 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74      ){.      Bit
28380 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
28390 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
283a0 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  er = wherePathSa
283b0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
283c0 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
283d0 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
283e0 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c      pFrom, 0, nL
283f0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
28400 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72  oop[nLoop-1], &r
28410 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a  evMask.      );.
28420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
28430 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20  Info->sorted==0 
28440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  );.      if( nOr
28450 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  der==pWInfo->pOr
28460 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
28470 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
28480 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  sorted = 1;.    
28490 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
284a0 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  ask = revMask;. 
284b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
284c0 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  ...  pWInfo->nRo
284d0 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
284e0 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
284f0 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
28500 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
28510 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
28520 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61  bFreeNN(db, pSpa
28530 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ce);.  return SQ
28540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28550 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75  * Most queries u
28560 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  se only a single
28570 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65   table (they are
28580 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20   not joins) and 
28590 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d  have.** simple =
285a0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67  = constraints ag
285b0 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69  ainst indexed fi
285c0 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74  elds.  This rout
285d0 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ine attempts.** 
285e0 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69  to plan those si
285f0 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67  mple cases using
28600 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d   much less cerem
28610 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  ony than the.** 
28620 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
28630 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61  query planner, a
28640 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64  nd thereby yield
28650 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f   faster sqlite3_
28660 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d  prepare().** tim
28670 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  es for the commo
28680 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  n case..**.** Re
28690 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
286a0 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69   success, if thi
286b0 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68  s query can be h
286c0 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a  andled by this.*
286d0 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72  * no-frills quer
286e0 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75  y planner.  Retu
286f0 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  rn zero if this 
28700 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20  query needs the 
28710 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
28720 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
28730 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
28740 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57   whereShortCut(W
28750 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
28760 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
28770 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
28780 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
28790 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
287a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
287b0 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  C;.  WhereTerm *
287c0 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f  pTerm;.  WhereLo
287d0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74  op *pLoop;.  int
287e0 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a   iCur;.  int j;.
287f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
28800 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20   Index *pIdx;.. 
28810 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
28820 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
28830 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
28840 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
28850 53 55 42 43 4c 41 55 53 45 20 29 20 72 65 74 75  SUBCLAUSE ) retu
28860 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
28870 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28880 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
28890 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
288a0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
288b0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
288c0 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
288d0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
288e0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
288f0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
28900 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
28910 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
28920 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
28930 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
28940 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
28950 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
28960 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
28970 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
28980 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
28990 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
289a0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
289b0 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
289c0 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
289d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
289e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
289f0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
28a00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
28a10 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
28a20 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
28a30 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
28a40 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
28a50 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
28a60 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
28a70 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
28a80 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
28a90 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
28aa0 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
28ab0 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
28ac0 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
28ad0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
28ae0 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
28af0 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
28b00 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
28b10 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
28b20 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
28b30 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
28b40 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
28b50 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
28b60 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
28b70 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
28b80 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
28b90 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
28ba0 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
28bb0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
28bc0 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
28bd0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
28be0 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
28bf0 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
28c00 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
28c10 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
28c20 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
28c30 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
28c40 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
28c50 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
28c60 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
28c70 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
28c80 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
28c90 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
28ca0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
28cb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
28cc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28cd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28ce0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
28cf0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
28d00 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
28d10 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
28d20 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
28d30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
28d40 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
28d50 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
28d60 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
28d70 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
28d80 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
28d90 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
28da0 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64 78 2d  >colUsed & pIdx-
28db0 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d 30  >colNotIdxed)==0
28dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
28dd0 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
28de0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
28df0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
28e00 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
28e10 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
28e20 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
28e30 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
28e40 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
28e50 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
28e60 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
28e70 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
28e80 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
28e90 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
28ea0 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
28eb0 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
28ec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
28ee0 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
28ef0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
28f00 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
28f10 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
28f20 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61  p = pLoop;.    a
28f30 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73  ssert( pWInfo->s
28f40 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20  MaskSet.n==1 && 
28f50 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d  iCur==pWInfo->sM
28f60 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a  askSet.ix[0] );.
28f70 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53      pLoop->maskS
28f80 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69  elf = 1; /* sqli
28f90 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
28fa0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
28fb0 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20  t, iCur); */.   
28fc0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54   pWInfo->a[0].iT
28fd0 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  abCur = iCur;.  
28fe0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
28ff0 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  t = 1;.    if( p
29000 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
29010 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
29020 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64   =  pWInfo->pOrd
29030 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
29040 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
29050 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29060 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
29070 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
29080 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
29090 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
290a0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
290b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
290c0 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
290d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
290e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
290f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29100 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
29110 66 6f 72 20 65 78 70 72 49 73 44 65 74 65 72 6d  for exprIsDeterm
29120 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73 74  inistic()..*/.st
29130 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
29140 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63  eIsDeterministic
29150 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
29160 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
29170 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
29180 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
29190 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
291a0 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74 46  pExpr, EP_ConstF
291b0 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  unc)==0 ){.    p
291c0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
291d0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
291e0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  C_Abort;.  }.  r
291f0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
29200 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ue;.}../*.** Ret
29210 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
29220 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
29230 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72  ins no non-deter
29240 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a 2a  ministic SQL .**
29250 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20 6e   functions. Do n
29260 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d  ot consider non-
29270 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51  deterministic SQ
29280 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  L functions that
29290 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f 66   are .** part of
292a0 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74 61 74   sub-select stat
292b0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
292c0 63 20 69 6e 74 20 65 78 70 72 49 73 44 65 74 65  c int exprIsDete
292d0 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72 20 2a  rministic(Expr *
292e0 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
292f0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
29300 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
29310 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
29320 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
29330 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69  xprNodeIsDetermi
29340 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53 65 6c  nistic;.  w.xSel
29350 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
29360 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
29370 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ail;.  sqlite3Wa
29380 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
29390 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
293a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
293b0 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
293c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
293d0 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
293e0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
293f0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
29400 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
29410 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
29420 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
29430 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
29440 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
29450 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
29460 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
29470 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
29480 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
29490 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
294a0 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
294b0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
294c0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
294d0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
294e0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
294f0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
29500 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
29510 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
29520 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
29530 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
29540 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
29550 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
29560 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
29570 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
29580 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
29590 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
295a0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
295b0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
295c0 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
295d0 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
295e0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
295f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29600 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
29610 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
29620 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
29630 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
29640 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
29650 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
29660 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
29670 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
29680 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
29690 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
296a0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
296b0 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
296c0 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
296d0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
296e0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
296f0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
29700 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29710 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
29720 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
29730 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
29740 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
29750 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
29780 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
29790 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
297a0 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
297b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
297c0 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
297f0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
29800 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
29810 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
29820 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
29830 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
29840 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
29850 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
29860 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
29870 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
29880 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
29890 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
298a0 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
298b0 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
298c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
298d0 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
298e0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
298f0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
29900 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
29910 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
29920 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
29930 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
29940 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
29950 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
29960 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
29970 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
29980 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
29990 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
299a0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
299b0 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
299c0 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
299d0 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
299e0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
299f0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
29a00 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
29a10 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
29a20 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
29a30 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
29a40 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
29a50 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
29a60 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
29a70 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
29a80 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
29a90 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
29aa0 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
29ab0 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
29ac0 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
29ad0 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
29ae0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
29af0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
29b00 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
29b10 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
29b20 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
29b30 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
29b40 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
29b50 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
29b60 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
29b70 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
29b80 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
29b90 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
29ba0 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
29bb0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
29bc0 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
29bd0 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
29be0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
29bf0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
29c00 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
29c10 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
29c20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
29c30 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
29c40 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
29c50 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
29c60 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
29c70 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
29c80 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
29c90 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
29ca0 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
29cb0 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
29cc0 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
29cd0 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
29ce0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
29cf0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
29d00 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
29d10 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
29d20 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
29d30 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
29d40 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
29d50 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
29d60 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
29d70 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
29d80 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
29d90 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
29da0 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
29db0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
29dc0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
29dd0 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
29de0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
29df0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
29e00 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
29e10 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
29e20 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
29e30 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
29e40 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
29e50 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
29e60 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
29e70 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
29e80 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
29e90 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
29ea0 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
29eb0 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
29ec0 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
29ed0 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
29ee0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
29ef0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
29f00 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
29f10 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
29f20 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
29f30 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
29f40 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
29f50 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
29f60 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
29f70 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
29f80 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
29f90 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
29fa0 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
29fb0 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
29fc0 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
29fd0 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
29fe0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
29ff0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
2a000 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
2a010 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
2a020 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2a030 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a040 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55  use (or the GROU
2a050 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69  P BY clause.** i
2a060 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
2a070 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
2a080 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f  in wctrlFlags) o
2a090 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2a0a0 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65  ment.** if there
2a0b0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2a0c0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2a0d0 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2a0e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2a0f0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2a100 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2a110 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2a120 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
2a130 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49  LL..**.** The iI
2a140 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20  dxCur parameter 
2a150 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
2a160 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
2a170 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f  .  If .** WHERE_
2a180 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20  OR_SUBCLAUSE is 
2a190 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
2a1a0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2a1b0 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
2a1c0 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
2a1d0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2a1e0 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
2a1f0 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
2a200 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
2a210 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
2a220 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2a230 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
2a240 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
2a250 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
2a260 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
2a270 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
2a280 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
2a290 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
2a2a0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
2a2b0 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
2a2c0 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
2a2d0 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
2a2e0 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
2a2f0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
2a300 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
2a310 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2a320 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2a330 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2a340 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2a350 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
2a360 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
2a370 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
2a380 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
2a390 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
2a3a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2a3b0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2a3c0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2a3d0 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44  y,     /* An ORD
2a3e0 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
2a3f0 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
2a400 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2a410 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 20  t *pResultSet,  
2a420 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75 6c 74   /* Query result
2a430 20 73 65 74 2e 20 20 52 65 71 27 64 20 66 6f 72   set.  Req'd for
2a440 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75   DISTINCT */.  u
2a450 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
2a460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2a470 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
2a480 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
2a490 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78  .h */.  int iAux
2a4a0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
2a4b0 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52 5f 53  /* If WHERE_OR_S
2a4c0 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c  UBCLAUSE is set,
2a4d0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
2a4e0 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  mber.           
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a500 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c  * If WHERE_USE_L
2a510 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c  IMIT, then the l
2a520 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29  imit amount */.)
2a530 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
2a540 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
2a550 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
2a560 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
2a570 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
2a580 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
2a590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a5a0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
2a5b0 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
2a5c0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2a5d0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
2a5e0 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
2a5f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2a600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2a610 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
2a620 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
2a630 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
2a640 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
2a650 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2a660 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
2a670 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
2a680 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
2a690 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oned */.  WhereL
2a6a0 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b  oopBuilder sWLB;
2a6b0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2a6c0 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f  eLoop builder */
2a6d0 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
2a6e0 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
2a6f0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
2a700 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
2a710 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2a720 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69  ;        /* A si
2a730 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57  ngle level in pW
2a740 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57  Info->a[] */.  W
2a750 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2a760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2a770 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
2a780 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2a790 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  t */.  int ii;  
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a7c0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
2a7d0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2a7e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2a7f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
2a800 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2a810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a820 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20  rn code */.  u8 
2a830 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20  bFordelete = 0; 
2a840 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41          /* OPFLA
2a850 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a  G_FORDELETE or z
2a860 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69  ero, as appropri
2a870 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ate */..  assert
2a880 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2a890 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2a8a0 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a  LTIROW)==0 || (.
2a8b0 20 20 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c          (wctrlFl
2a8c0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a8d0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2a8e0 0a 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46  .     && (wctrlF
2a8f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
2a900 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20  SUBCLAUSE)==0 . 
2a910 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20   ));..  /* Only 
2a920 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f  one of WHERE_OR_
2a930 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57 48 45  SUBCLAUSE or WHE
2a940 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a  RE_USE_LIMIT */.
2a950 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
2a960 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2a970 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
2a980 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
2a990 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a9a0 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_USE_LIMIT)==0 
2a9b0 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
2a9c0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2a9d0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
2a9e0 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
2a9f0 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
2aa00 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41  (sWLB));..  /* A
2aa10 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59  n ORDER/GROUP BY
2aa20 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20   clause of more 
2aa30 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61  than 63 terms ca
2aa40 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
2aa50 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  d */.  testcase(
2aa60 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
2aa70 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d  derBy->nExpr==BM
2aa80 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  S-1 );.  if( pOr
2aa90 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
2aaa0 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  y->nExpr>=BMS ) 
2aab0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2aac0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
2aad0 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
2aae0 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
2aaf0 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
2ab00 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
2ab10 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
2ab20 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
2ab30 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
2ab40 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2ab50 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
2ab60 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
2ab70 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2ab80 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2ab90 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
2aba0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
2abb0 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
2abc0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
2abd0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2abe0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2abf0 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2ac00 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
2ac10 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
2ac20 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
2ac30 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
2ac40 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
2ac50 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2ac60 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
2ac70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2ac80 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
2ac90 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
2aca0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
2acb0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
2acc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
2acd0 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
2ace0 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
2acf0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
2ad00 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
2ad10 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
2ad20 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2ad30 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2ad40 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
2ad50 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
2ad60 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
2ad70 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
2ad80 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
2ad90 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
2ada0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
2adb0 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
2adc0 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
2add0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
2ade0 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
2adf0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2ae00 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 20 3f  _OR_SUBCLAUSE) ?
2ae10 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
2ae20 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
2ae30 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2ae40 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
2ae50 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2ae60 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
2ae70 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
2ae80 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
2ae90 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
2aea0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
2aeb0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
2aec0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
2aed0 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
2aee0 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
2aef0 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
2af00 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
2af10 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
2af20 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
2af30 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
2af40 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
2af50 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
2af60 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
2af70 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
2af80 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
2af90 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
2afa0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
2afb0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
2afc0 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
2afd0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
2afe0 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
2aff0 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
2b000 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2b010 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2b020 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
2b030 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
2b040 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
2b050 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
2b060 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2b070 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2b080 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
2b090 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
2b0a0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2b0b0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
2b0c0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
2b0d0 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
2b0e0 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
2b0f0 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
2b100 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2b110 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68  y;.  pWInfo->pWh
2b120 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
2b130 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
2b140 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
2b150 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
2b160 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
2b170 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
2b180 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
2b190 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
2b1a0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
2b1b0 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66  ->iBreak = pWInf
2b1c0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  o->iContinue = s
2b1d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2b1e0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  bel(pParse);.  p
2b1f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2b200 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
2b210 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74    pWInfo->iLimit
2b220 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57   = iAuxArg;.  pW
2b230 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2b240 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
2b250 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65  nQueryLoop;.  me
2b260 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f  mset(&pWInfo->nO
2b270 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  BSat, 0, .      
2b280 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72     offsetof(Wher
2b290 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66  eInfo,sWC) - off
2b2a0 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c  setof(WhereInfo,
2b2b0 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73  nOBSat));.  mems
2b2c0 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  et(&pWInfo->a[0]
2b2d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  , 0, sizeof(Wher
2b2e0 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a  eLoop)+nTabList*
2b2f0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2b300 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l));.  assert( p
2b310 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2b320 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20  =ONEPASS_OFF ); 
2b330 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61   /* ONEPASS defa
2b340 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20  ults to OFF */. 
2b350 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
2b360 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
2b370 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
2b380 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
2b390 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
2b3a0 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
2b3b0 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
2b3c0 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
2b3d0 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
2b3e0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2b3f0 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
2b400 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
2b410 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
2b420 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2b430 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
2b440 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
2b450 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
2b460 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
2b470 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
2b480 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
2b490 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
2b4a0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2b4b0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
2b4c0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2b4d0 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
2b4e0 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
2b4f0 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
2b500 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
2b510 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
2b520 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
2b530 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
2b540 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
2b550 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
2b560 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
2b570 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
2b580 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
2b590 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
2b5a0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
2b5b0 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
2b5c0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
2b5d0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2b5e0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
2b5f0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2b600 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2b610 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2b620 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70  E;.    }.    Exp
2b630 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
2b640 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2b650 43 4f 4e 53 54 41 4e 54 20 52 4f 57 22 29 29 3b  CONSTANT ROW"));
2b660 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2b670 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
2b680 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
2b690 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
2b6a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2b6b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b6c0 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20  he N-th term of 
2b6d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b6e0 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62 69  is assigned a bi
2b6f0 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20  tmask of 1<<N.. 
2b700 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2b710 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65   rule of the pre
2b720 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65  vious sentence e
2b730 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58  nsures thta if X
2b740 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
2b750 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  for.    ** a tab
2b760 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
2b770 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2b780 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
2b790 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
2b7a0 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77  f T..    ** Know
2b7b0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
2b7c0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2b7d0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
2b7e0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20  left join is.   
2b7f0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
2b800 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
2b810 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2b820 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
2b830 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2b840 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
2b850 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20  c tables in.    
2b860 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2b870 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2b880 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2b890 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2b8a0 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71  rmally.    ** eq
2b8b0 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
2b8c0 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
2b8d0 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
2b8e0 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  1 if the.    ** 
2b8f0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2b900 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
2b910 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20      */.    ii = 
2b920 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
2b930 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2b940 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2b950 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2b960 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2b970 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50  reTabFuncArgs(pP
2b980 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d  arse, &pTabList-
2b990 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d  >a[ii], &pWInfo-
2b9a0 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c  >sWC);.    }whil
2b9b0 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69  e( (++ii)<pTabLi
2b9c0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69  st->nSrc );.  #i
2b9d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2b9e0 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69  G.    {.      Bi
2b9f0 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20  tmask mx = 0;.  
2ba00 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2ba10 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2ba20 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2ba30 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69  Bitmask m = sqli
2ba40 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
2ba50 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
2ba60 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
2ba70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2ba80 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20  rt( m>=mx );.   
2ba90 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20       mx = m;.   
2baa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e     }.    }.  #en
2bab0 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  dif.  }.  .  /* 
2bac0 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2bad0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2bae0 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
2baf0 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
2bb00 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2bb10 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
2bb20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2bb30 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2bb40 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70  nError;..  /* Sp
2bb50 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52  ecial case: WHER
2bb60 45 20 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20  E terms that do 
2bb70 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
2bb80 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2bb90 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61  oin.  ** (consta
2bba0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e  nt expressions).
2bbb0 20 45 76 61 6c 75 61 74 65 20 65 61 63 68 20 73   Evaluate each s
2bbc0 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75  uch term, and ju
2bbd0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a  mp over all the.
2bbe0 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63    ** generated c
2bbf0 6f 64 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ode if the resul
2bc00 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20  t is not true.  
2bc10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f  .  **.  ** Do no
2bc20 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68 65  t do this if the
2bc30 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
2bc40 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  ains non-determi
2bc50 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73  nistic functions
2bc60 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  .  ** that are n
2bc70 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ot within a sub-
2bc80 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
2bc90 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65 71  not strictly req
2bca0 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20  uired, but.  ** 
2bcb0 70 72 65 73 65 72 76 65 73 20 53 51 4c 69 74 65  preserves SQLite
2bcc0 27 73 20 6c 65 67 61 63 79 20 62 65 68 61 76 69  's legacy behavi
2bcd0 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  our in the follo
2bce0 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a  wing two cases:.
2bcf0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d    **.  **   FROM
2bd00 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f   ... WHERE rando
2bd10 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20  m()>0;          
2bd20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28   -- eval random(
2bd30 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20  ) once per row. 
2bd40 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57   **   FROM ... W
2bd50 48 45 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e  HERE (SELECT ran
2bd60 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76  dom())>0;  -- ev
2bd70 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65  al random() once
2bd80 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20   overall.  */.  
2bd90 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c  for(ii=0; ii<sWL
2bda0 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69  B.pWC->nTerm; ii
2bdb0 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
2bdc0 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70  rm *pT = &sWLB.p
2bdd0 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69  WC->a[ii];.    i
2bde0 66 28 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 26  f( pT->wtFlags &
2bdf0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
2be00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2be10 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d  ( pT->prereqAll=
2be20 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  =0 && (nTabList=
2be30 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74 65  =0 || exprIsDete
2be40 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70 45  rministic(pT->pE
2be50 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20 73  xpr)) ){.      s
2be60 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2be70 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70 45  e(pParse, pT->pE
2be80 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  xpr, pWInfo->iBr
2be90 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2bea0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
2beb0 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  T->wtFlags |= TE
2bec0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
2bed0 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
2bee0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2bef0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2bf00 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
2bf10 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
2bf20 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
2bf30 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
2bf40 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
2bf50 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
2bf60 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
2bf70 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
2bf80 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
2bf90 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2bfa0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2bfb0 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
2bfc0 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
2bfd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
2bfe0 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
2bff0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
2c000 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
2c010 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
2c020 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
2c030 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
2c040 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
2c050 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
2c060 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
2c070 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
2c080 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
2c090 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2c0a0 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cts */.#if defin
2c0b0 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
2c0c0 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
2c0d0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2c0e0 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73   0xffff ){.    s
2c0f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c100 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  f("*** Optimizer
2c110 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72   Start *** (wctr
2c120 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63  lFlags: 0x%x",wc
2c130 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  trlFlags);.    i
2c140 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2c150 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
2c160 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c170 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c  DebugPrintf(", l
2c180 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41  imit: %d", iAuxA
2c190 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rg);.    }.    s
2c1a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c1b0 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  f(")\n");.  }.  
2c1c0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2c1d0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2c1e0 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2c1f0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2c200 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
2c210 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
2c220 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57  usePrint(sWLB.pW
2c230 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
2c240 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
2c250 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
2c260 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
2c270 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2c280 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
2c290 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2c2a0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2c2b0 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
2c2c0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2c2d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c2e0 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
2c2f0 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2c300 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2c310 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
2c320 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
2c330 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2c340 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2c350 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
2c360 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
2c370 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2c380 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3b0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2c3c0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
2c3d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
2c3e0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
2c3f0 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
2c400 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
2c410 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
2c420 62 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c  bel[i%(sizeof(zL
2c430 61 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20  abel)-1)];.     
2c440 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2c450 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  t(p, sWLB.pWC);.
2c460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2c470 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
2c480 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
2c490 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
2c4a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c4b0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c4c0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
2c4d0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2c4e0 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
2c4f0 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
2c500 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
2c510 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
2c520 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2c530 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2c540 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
2c550 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
2c560 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
2c570 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
2c580 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
2c590 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
2c5a0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
2c5b0 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20  = ALLBITS;.  }. 
2c5c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2c5d0 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
2c5e0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
2c5f0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2c600 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
2c610 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2c620 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2c630 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2c640 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
2c650 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
2c660 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
2c670 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
2c680 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
2c690 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
2c6a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2c6b0 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
2c6c0 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
2c6d0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
2c6e0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
2c6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
2c700 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
2c710 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
2c720 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
2c730 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
2c740 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2c750 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
2c760 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
2c770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c780 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2c790 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2c7a0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
2c7b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2c7c0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2c7d0 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
2c7e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c7f0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
2c800 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2c810 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
2c820 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2c830 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2c840 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
2c850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2c870 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c880 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
2c890 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
2c8a0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
2c8b0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2c8c0 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
2c8d0 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
2c8e0 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
2c8f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74  .#endif..  /* At
2c900 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
2c910 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
2c920 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61  in that do not a
2c930 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
2c940 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62  ..  ** For a tab
2c950 6c 65 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74  le to not affect
2c960 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65   the result, the
2c970 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20   following must 
2c980 62 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  be true:.  **.  
2c990 2a 2a 20 20 20 31 29 20 54 68 65 20 71 75 65 72  **   1) The quer
2c9a0 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e  y must not be an
2c9b0 20 61 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a   aggregate..  **
2c9c0 20 20 20 32 29 20 54 68 65 20 74 61 62 6c 65 20     2) The table 
2c9d0 6d 75 73 74 20 62 65 20 74 68 65 20 52 48 53 20  must be the RHS 
2c9e0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
2c9f0 20 20 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72    **   3) Either
2ca00 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2ca10 62 65 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20  be DISTINCT, or 
2ca20 65 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55  else the ON or U
2ca30 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a  SING clause.  **
2ca40 20 20 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61        must conta
2ca50 69 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  in a constraint 
2ca60 74 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20  that limits the 
2ca70 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  scan of the tabl
2ca80 65 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20  e to .  **      
2ca90 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65  at most a single
2caa0 20 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20   row..  **   4) 
2cab0 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e  The table must n
2cac0 6f 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64  ot be referenced
2cad0 20 62 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20   by any part of 
2cae0 74 68 65 20 71 75 65 72 79 20 61 70 61 72 74 0a  the query apart.
2caf0 20 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69    **      from i
2cb00 74 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20  ts own USING or 
2cb10 4f 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  ON clause..  **.
2cb20 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65    ** For example
2cb30 2c 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20  , given:.  **.  
2cb40 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2cb50 42 4c 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47  BLE t1(ipk INTEG
2cb60 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2cb70 76 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  v1);.  **     CR
2cb80 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 70  EATE TABLE t2(ip
2cb90 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2cba0 59 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a  Y KEY, v2);.  **
2cbb0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2cbc0 45 20 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52  E t3(ipk INTEGER
2cbd0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33   PRIMARY KEY, v3
2cbe0 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65  );.  **.  ** the
2cbf0 6e 20 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62  n table t2 can b
2cc00 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  e omitted from t
2cc10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2cc20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2cc30 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74  CT v1, v3 FROM t
2cc40 31 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45  1 .  **       LE
2cc50 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47  FT JOIN t2 USING
2cc60 20 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29   (t1.ipk=t2.ipk)
2cc70 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2cc80 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28   JOIN t3 USING (
2cc90 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20  t1.ipk=t3.ipk). 
2cca0 20 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d   **.  ** or from
2ccb0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2ccc0 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2ccd0 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a  v1, v3 FROM t1 .
2cce0 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2ccf0 4a 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20  JOIN t2.  **    
2cd00 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20     LEFT JOIN t3 
2cd10 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33  USING (t1.ipk=t3
2cd20 2e 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74  .ipk).  */.  not
2cd30 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
2cd40 6b 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  k)0;.  if( pWInf
2cd50 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
2cd60 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cd80 2a 20 67 75 61 72 61 6e 74 65 65 73 20 63 6f 6e  * guarantees con
2cd90 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65  dition (1) above
2cda0 20 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69 6d 69   */.   && Optimi
2cdb0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2cdc0 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
2cdd0 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
2cde0 69 6e 74 20 69 3b 0a 20 20 20 20 42 69 74 6d 61  int i;.    Bitma
2cdf0 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
2ce00 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
2ce10 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
2ce20 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
2ce30 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
2ce40 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62  rBy ){.      tab
2ce50 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57  Used |= sqlite3W
2ce60 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
2ce70 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
2ce80 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
2ce90 7d 0a 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e  }.    for(i=pWIn
2cea0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
2ceb0 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =1; i--){.      
2cec0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2ced0 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 73  , *pEnd;.      s
2cee0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2cef0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2cf00 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
2cf10 3e 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[i].pWLoop;.  
2cf20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 57 49      pItem = &pWI
2cf30 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2cf40 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20  [pLoop->iTab];. 
2cf50 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d       if( (pItem-
2cf60 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2cf70 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e  T_LEFT)==0 ) con
2cf80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2cf90 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2cfa0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2cfb0 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
2cfc0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2cfd0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
2cfe0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
2cff0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2d000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d010 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f   (tabUsed & pLoo
2d020 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  p->maskSelf)!=0 
2d030 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d040 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
2d050 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
2d060 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
2d070 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
2d080 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
2d090 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2d0a0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2d0b0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
2d0c0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2d0d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d0e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2d0f0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
2d100 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
2d110 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d         || pTerm-
2d120 3e 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f  >pExpr->iRightJo
2d130 69 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e  inTable!=pItem->
2d140 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20 20  iCursor.        
2d150 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2d160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d170 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d180 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d190 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e  pTerm<pEnd ) con
2d1a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45  tinue;.      WHE
2d1b0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20  RETRACE(0xffff, 
2d1c0 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25  ("-> drop loop %
2d1d0 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70  c not used\n", p
2d1e0 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20  Loop->cId));.   
2d1f0 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
2d200 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2d210 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
2d220 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
2d230 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
2d240 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2d250 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2d260 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2d270 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  elf)!=0 ){.     
2d280 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2d290 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2d2a0 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
2d2b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2d2c0 21 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  !=pWInfo->nLevel
2d2d0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  -1 ){.        in
2d2e0 74 20 6e 42 79 74 65 20 3d 20 28 70 57 49 6e 66  t nByte = (pWInf
2d2f0 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a  o->nLevel-1-i) *
2d300 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76   sizeof(WhereLev
2d310 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  el);.        mem
2d320 6d 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b  move(&pWInfo->a[
2d330 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  i], &pWInfo->a[i
2d340 2b 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  +1], nByte);.   
2d350 20 20 20 7d 0a 20 20 20 20 20 20 70 57 49 6e 66     }.      pWInf
2d360 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
2d370 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
2d380 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
2d390 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
2d3a0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
2d3b0 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
2d3c0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
2d3d0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
2d3e0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
2d3f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2d400 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
2d410 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2d420 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
2d430 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
2d440 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
2d450 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
2d460 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
2d470 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
2d480 2a 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73  *.  ** A one-pas
2d490 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62  s approach can b
2d4a0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 63 61  e used if the ca
2d4b0 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
2d4c0 65 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20  ed one.  ** and 
2d4d0 65 69 74 68 65 72 20 28 61 29 20 74 68 65 20 73  either (a) the s
2d4e0 63 61 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f  can visits at mo
2d4f0 73 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62  st one row or (b
2d500 29 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74  ) each.  ** of t
2d510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2d520 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
2d530 20 20 20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20     * the caller 
2d540 68 61 73 20 69 6e 64 69 63 61 74 65 64 20 74 68  has indicated th
2d550 61 74 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70  at a one-pass ap
2d560 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73  proach can be us
2d570 65 64 0a 20 20 2a 2a 20 20 20 20 20 77 69 74 68  ed.  **     with
2d580 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 28   multiple rows (
2d590 62 79 20 73 65 74 74 69 6e 67 20 57 48 45 52 45  by setting WHERE
2d5a0 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
2d5b0 57 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a  W), and.  **   *
2d5c0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   the table is no
2d5d0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
2d5e0 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20  e, and.  **   * 
2d5f0 65 69 74 68 65 72 20 74 68 65 20 73 63 61 6e 20  either the scan 
2d600 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65  does not use the
2d610 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
2d620 20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   or the caller. 
2d630 20 2a 2a 20 20 20 20 20 69 73 20 61 20 44 45 4c   **     is a DEL
2d640 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 28 57  ETE operation (W
2d650 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2d660 4f 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65 63 69  OK is only speci
2d670 66 69 65 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f  fied.  **     fo
2d680 72 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a  r DELETE)..  **.
2d690 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 71 75    ** The last qu
2d6a0 61 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 62  alification is b
2d6b0 65 63 61 75 73 65 20 61 6e 20 55 50 44 41 54 45  ecause an UPDATE
2d6c0 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 73 0a   statement uses.
2d6d0 20 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61    ** WhereInfo.a
2d6e0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74  iCurOnePass[1] t
2d6f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2d700 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 72 65  her or not it re
2d710 61 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73  ally can.  ** us
2d720 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70  e a one-pass app
2d730 72 6f 61 63 68 2c 20 61 6e 64 20 74 68 69 73 20  roach, and this 
2d740 69 73 20 6e 6f 74 20 73 65 74 20 61 63 63 75 72  is not set accur
2d750 61 74 65 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a  ately for scans.
2d760 20 20 2a 2a 20 74 68 61 74 20 75 73 65 20 74 68    ** that use th
2d770 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
2d780 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
2d790 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2d7a0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2d7b0 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2d7c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2d7d0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2d7e0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2d7f0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2d800 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  ){.    int wsFla
2d810 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  gs = pWInfo->a[0
2d820 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2d830 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72  s;.    int bOner
2d840 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  ow = (wsFlags & 
2d850 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
2d860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  ;.    assert( !(
2d870 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d880 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 7c 7c  VIRTUALTABLE) ||
2d890 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c   IsVirtual(pTabL
2d8a0 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
2d8b0 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72  );.    if( bOner
2d8c0 6f 77 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  ow || (.        
2d8d0 30 21 3d 28 77 63 74 72 6c 46 6c 61 67 73 20 26  0!=(wctrlFlags &
2d8e0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2d8f0 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 26 26  ULTIROW).     &&
2d900 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
2d910 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  List->a[0].pTab)
2d920 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73  .     && (0==(ws
2d930 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2d940 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
2d950 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2d960 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20  UPLICATES_OK)). 
2d970 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49     )){.      pWI
2d980 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20  nfo->eOnePass = 
2d990 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53  bOnerow ? ONEPAS
2d9a0 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41  S_SINGLE : ONEPA
2d9b0 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20  SS_MULTI;.      
2d9c0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
2d9d0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
2d9e0 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20  ) && (wsFlags & 
2d9f0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2da00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
2da10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2da20 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
2da30 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
2da40 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46  bFordelete = OPF
2da50 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20  LAG_FORDELETE;. 
2da60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da70 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
2da80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
2da90 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52  (wsFlags & ~WHER
2daa0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20  E_IDX_ONLY);.   
2dab0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2dac0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
2dad0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
2dae0 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
2daf0 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
2db00 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
2db10 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
2db20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20   */.  for(ii=0, 
2db30 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2db40 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
2db50 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2db60 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2db70 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
2db80 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
2db90 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
2dba0 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
2dbb0 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
2dbc0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
2dbd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2dbe0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
2dbf0 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
2dc00 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2dc10 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2dc20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
2dc30 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20  ->pTab;.    iDb 
2dc40 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2dc50 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2dc60 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70  >pSchema);.    p
2dc70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2dc80 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
2dc90 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2dca0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2dcb0 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
2dcc0 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
2dcd0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
2dce0 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
2dcf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2dd00 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2dd10 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2dd20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2dd30 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
2dd40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
2dd50 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
2dd60 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
2dd70 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2dd80 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
2dd90 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2dda0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
2ddb0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2ddc0 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
2ddd0 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
2dde0 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
2ddf0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2de00 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
2de10 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
2de20 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2de30 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2de40 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2de50 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
2de60 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2de70 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2de80 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
2de90 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
2dea0 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Read;.      if( 
2deb0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2dec0 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
2ded0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2dee0 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
2def0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
2df00 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54  rOnePass[0] = pT
2df10 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
2df20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
2df30 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
2df40 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
2df50 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
2df60 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
2df70 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
2df80 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65  em->iCursor==pLe
2df90 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a  vel->iTabCur );.
2dfa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dfb0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2dfc0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2dfd0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2dfe0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
2dff0 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
2e000 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2e010 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
2e020 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
2e030 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2e040 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2e050 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  F && pTab->nCol<
2e060 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28  BMS && HasRowid(
2e070 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2e080 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
2e090 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
2e0a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
2e0b0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
2e0c0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
2e0d0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
2e0e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2e0f0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54  , -1, SQLITE_INT
2e100 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
2e110 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
2e120 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
2e130 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
2e140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2e150 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
2e160 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  S.      if( pLoo
2e170 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2e180 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x!=0 ){.        
2e190 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2e1a0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
2e1b0 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29  EKEQ|bFordelete)
2e1c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2e1d0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
2e1e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e1f0 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72  ChangeP5(v, bFor
2e200 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d  delete);.      }
2e210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2e220 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2e230 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c  D_MASK.      sql
2e240 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
2e250 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
2e260 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e  Used, pTabItem->
2e270 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20  iCursor, 0, 0,. 
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e290 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
2e2a0 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d  t u8*)&pTabItem-
2e2b0 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  >colUsed, P4_INT
2e2c0 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
2e2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2e2e0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2e2f0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2e300 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2e310 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2e320 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2e330 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2e340 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
2e350 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
2e360 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2e370 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
2e380 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
2e390 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
2e3a0 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78  d;.      /* iAux
2e3b0 41 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  Arg is always se
2e3c0 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20  t to a positive 
2e3d0 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53  value if ONEPASS
2e3e0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   is possible */.
2e3f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41        assert( iA
2e400 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49  uxArg!=0 || (pWI
2e410 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2e420 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2e430 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20  DESIRED)==0 );. 
2e440 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
2e450 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72  id(pTab) && IsPr
2e460 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
2e470 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63  x).       && (wc
2e480 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2e490 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d  _OR_SUBCLAUSE)!=
2e4a0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
2e4b0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e     /* This is on
2e4c0 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d  e term of an OR-
2e4d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69  optimization usi
2e4e0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2e4f0 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20  EY of a.        
2e500 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ** WITHOUT ROWID
2e510 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64   table.  No need
2e520 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20   for a separate 
2e530 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
2e540 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65   iIndexCur = pLe
2e550 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20  vel->iTabCur;.  
2e560 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20        op = 0;.  
2e570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
2e580 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2e590 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2e5a0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a         Index *pJ
2e5b0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2e5c0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
2e5d0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
2e5e0 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
2e5f0 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61  assert( wctrlFla
2e600 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2e610 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20  SS_DESIRED );.  
2e620 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
2e630 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70  AYS(pJ) && pJ!=p
2e640 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ix ){.          
2e650 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20  iIndexCur++;.   
2e660 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e         pJ = pJ->
2e670 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
2e680 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2e690 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
2e6a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
2e6b0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49  rOnePass[1] = iI
2e6c0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d  ndexCur;.      }
2e6d0 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67  else if( iAuxArg
2e6e0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2e6f0 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2e700 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  AUSE)!=0 ){.    
2e710 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2e720 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20  iAuxArg;.       
2e730 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49   op = OP_ReopenI
2e740 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dx;.      }else{
2e750 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2e760 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
2e770 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
2e780 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
2e790 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  ur = iIndexCur;.
2e7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2e7b0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
2e7c0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
2e7d0 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
2e7e0 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
2e7f0 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20   if( op ){.     
2e800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e810 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64  dOp3(v, op, iInd
2e820 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
2e830 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
2e840 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
2e850 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
2e860 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pIx);.        if
2e870 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2e880 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
2e890 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20  AINT)!=0.       
2e8a0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
2e8b0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
2e8c0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
2e8d0 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20  _SKIPSCAN))==0. 
2e8e0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
2e8f0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57  fo->wctrlFlags&W
2e900 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2e910 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2e920 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2e930 63 74 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct!=WHERE_DISTIN
2e940 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20  CT_ORDERED.     
2e950 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2e960 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2e970 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
2e980 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74  EKEQ); /* Hint t
2e990 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20  o COMDB2 */.    
2e9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64      }.        Vd
2e9b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2e9c0 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
2e9d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e9e0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
2e9f0 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20  ED_MASK.        
2ea00 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20  {.          u64 
2ea10 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20  colUsed = 0;.   
2ea20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a         int ii, j
2ea30 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  j;.          for
2ea40 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e  (ii=0; ii<pIx->n
2ea50 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
2ea60 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
2ea70 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69  pIx->aiColumn[ii
2ea80 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
2ea90 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e  f( jj<0 ) contin
2eaa0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2eab0 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d  if( jj>63 ) jj =
2eac0 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20   63;.           
2ead0 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e   if( (pTabItem->
2eae0 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
2eaf0 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74  T(jj))==0 ) cont
2eb00 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2eb10 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75    colUsed |= ((u
2eb20 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20  64)1)<<(ii<63 ? 
2eb30 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20  ii : 63);.      
2eb40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2eb50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2eb60 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
2eb70 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43  mnsUsed, iIndexC
2eb80 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ur, 0, 0,.      
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eba0 20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26            (u8*)&
2ebb0 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36  colUsed, P4_INT6
2ebc0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  4);.        }.#e
2ebd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
2ebe0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2ebf0 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20  D_MASK */.      
2ec00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2ec10 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33  iDb>=0 ) sqlite3
2ec20 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
2ec30 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
2ec40 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
2ec50 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2ec60 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2ec70 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2ec80 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2ec90 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
2eca0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
2ecb0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
2ecc0 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
2ecd0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
2ece0 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
2ecf0 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
2ed00 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
2ed10 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
2ed20 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
2ed30 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  m..  */.  for(ii
2ed40 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  =0; ii<nTabList;
2ed50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ii++){.    int 
2ed60 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
2ed70 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20   int wsFlags;.  
2ed80 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
2ed90 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
2eda0 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d  sFlags = pLevel-
2edb0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
2edc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2edd0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2ede0 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
2edf0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
2ee00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
2ee10 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
2ee20 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
2ee30 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
2ee40 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
2ee50 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
2ee60 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
2ee70 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2ee80 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
2ee90 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
2eea0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2eeb0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2eec0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
2eed0 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70  ndif.    addrExp
2eee0 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68  lain = sqlite3Wh
2eef0 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ereExplainOneSca
2ef00 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n(.        pPars
2ef10 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
2ef20 76 65 6c 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a  vel, wctrlFlags.
2ef30 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65      );.    pLeve
2ef40 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
2ef50 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2ef60 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
2ef70 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57  Ready = sqlite3W
2ef80 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
2ef90 74 61 72 74 28 70 50 61 72 73 65 2c 76 2c 70 57  tart(pParse,v,pW
2efa0 49 6e 66 6f 2c 69 69 2c 70 4c 65 76 65 6c 2c 6e  Info,ii,pLevel,n
2efb0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2efc0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2efd0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2efe0 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46  nt;.    if( (wsF
2eff0 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
2f000 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72  _OR)==0 && (wctr
2f010 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f  lFlags&WHERE_OR_
2f020 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b  SUBCLAUSE)==0 ){
2f030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
2f040 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
2f050 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
2f060 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
2f070 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
2f080 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
2f090 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2f0a0 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
2f0b0 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
2f0c0 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
2f0d0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
2f0e0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
2f0f0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
2f100 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
2f110 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
2f120 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2f130 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2f140 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
2f150 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2f160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2f170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f  .}../*.** Part o
2f180 66 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  f sqlite3WhereEn
2f190 64 28 29 20 77 69 6c 6c 20 72 65 77 72 69 74 65  d() will rewrite
2f1a0 20 6f 70 63 6f 64 65 73 20 74 6f 20 72 65 66 65   opcodes to refe
2f1b0 72 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e 64  rence the.** ind
2f1c0 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ex rather than t
2f1d0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
2f1e0 49 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  In SQLITE_DEBUG 
2f1f0 6d 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a 2a 2a  mode, we want.**
2f200 20 74 6f 20 74 72 61 63 65 20 74 68 6f 73 65 20   to trace those 
2f210 63 68 61 6e 67 65 73 20 69 66 20 50 52 41 47 4d  changes if PRAGM
2f220 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63  A vdbe_addoptrac
2f230 65 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  e=on.  This rout
2f240 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68 61 74  ine.** does that
2f250 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2f260 49 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69  ITE_DEBUG.# defi
2f270 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ne OpcodeRewrite
2f280 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f 2a 20  Trace(D,K,P) /* 
2f290 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65 0a 23  no-op */.#else.#
2f2a0 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65   define OpcodeRe
2f2b0 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50  writeTrace(D,K,P
2f2c0 29 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70  ) sqlite3WhereOp
2f2d0 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
2f2e0 28 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74 69 63  (D,K,P).  static
2f2f0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65   void sqlite3Whe
2f300 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54  reOpcodeRewriteT
2f310 72 61 63 65 28 0a 20 20 20 20 73 71 6c 69 74 65  race(.    sqlite
2f320 33 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74 20 70  3 *db,.    int p
2f330 63 2c 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  c,.    VdbeOp *p
2f340 4f 70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  Op.  ){.    if( 
2f350 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2f360 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
2f370 63 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ce)==0 ) return;
2f380 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f390 50 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c 20 70  PrintOp(0, pc, p
2f3a0 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Op);.  }.#endif.
2f3b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2f3c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2f3d0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
2f3e0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
2f3f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2f400 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
2f410 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2f420 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
2f430 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
2f440 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
2f450 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2f460 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2f470 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2f480 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2f490 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
2f4a0 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
2f4b0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
2f4c0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2f4d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2f4e0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
2f4f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2f500 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
2f510 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
2f520 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  code..  */.  Vdb
2f530 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
2f540 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f  v, "End WHERE-co
2f550 72 65 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 70  re"));.  for(i=p
2f560 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
2f570 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2f580 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
2f590 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2f5a0 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2f5b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2f5c0 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  p;.    if( pLeve
2f5d0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
2f5e0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2f5f0 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45  _DISABLE_SKIPAHE
2f600 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  AD_DISTINCT.    
2f610 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d    int addrSeek =
2f620 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
2f630 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  *pIdx;.      int
2f640 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   n;.      if( pW
2f650 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2f660 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2f670 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26  ORDERED.       &
2f680 26 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  & i==pWInfo->nLe
2f690 76 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b 65 74  vel-1  /* Ticket
2f6a0 20 5b 65 66 39 33 31 38 37 35 37 62 31 35 32 65   [ef9318757b152e
2f6b0 33 5d 20 32 30 31 37 2d 31 30 2d 32 31 20 2a 2f  3] 2017-10-21 */
2f6c0 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
2f6d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2f6e0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2f6f0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d        && (pIdx =
2f700 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f710 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74  pIndex)->hasStat
2f720 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d  1.       && (n =
2f730 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f740 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20 20  nIdxCol)>0.     
2f750 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77    && pIdx->aiRow
2f760 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20  LogEst[n]>=36.  
2f770 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2f780 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e  nt r1 = pParse->
2f790 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
2f7a0 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20  int j, op;.     
2f7b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2f7c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2f7d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f7e0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2f7f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2f800 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20  , j, r1+j);.    
2f810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
2f820 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b  arse->nMem += n+
2f830 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  1;.        op = 
2f840 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50  pLevel->op==OP_P
2f850 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20  rev ? OP_SeekLT 
2f860 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20  : OP_SeekGT;.   
2f870 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20       addrSeek = 
2f880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f890 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76  4Int(v, op, pLev
2f8a0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20  el->iIdxCur, 0, 
2f8b0 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  r1, n);.        
2f8c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2f8d0 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
2f8e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2f8f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2f900 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20  OP_SeekGT);.    
2f910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f920 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2f930 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  , 1, pLevel->p2)
2f940 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2f950 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
2f960 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2f970 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f  TINCT */.      /
2f980 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
2f990 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  e: Advance to th
2f9a0 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  e next row */.  
2f9b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f9c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2f9d0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2f9e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f9f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2fa00 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2fa10 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2fa20 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2fa30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2fa40 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2fa50 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2fa60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2fa70 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2fa80 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2fa90 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2faa0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2fab0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2fac0 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2fad0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2fae0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2faf0 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64 65  P_VNext);.#ifnde
2fb00 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2fb10 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49  _SKIPAHEAD_DISTI
2fb20 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61 64  NCT.      if( ad
2fb30 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65 33  drSeek ) sqlite3
2fb40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2fb50 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64 69  addrSeek);.#endi
2fb60 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2fb70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2fb80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2fb90 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2fba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2fbb0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2fbc0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2fbd0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2fbe0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2fbf0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2fc00 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2fc10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2fc20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2fc30 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2fc40 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2fc50 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2fc60 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2fc70 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2fc80 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2fc90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fca0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2fcb0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2fcc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2fcd0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2fce0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2fcf0 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 6e 50       if( pIn->nP
2fd00 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20  refix ){.       
2fd10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
2fd20 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2fd30 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20  ERE_IN_EARLYOUT 
2fd40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2fd50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2fd60 49 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f  Int(v, OP_IfNoHo
2fd70 70 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  pe, pLevel->iIdx
2fd80 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fda0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
2fdb0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 0a  rrentAddr(v)+2,.
2fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2fde0 6e 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d 3e 6e  n->iBase, pIn->n
2fdf0 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Prefix);.       
2fe00 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2fe10 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
2fe20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2fe30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fe40 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2fe50 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
2fe60 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
2fe70 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2fe80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2fe90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2fea0 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2feb0 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  opOp==OP_Prev);.
2fec0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2fed0 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2fee0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2fef0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Next);.        }
2ff00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ff10 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ff20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
2ff30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ff40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ff50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2ff60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
2ff70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2ff80 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20  ->addrSkip ){.  
2ff90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2ffa0 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2ffb0 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2ffc0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ffd0 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20  "next skip-scan 
2ffe0 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75  on %s", pLoop->u
2fff0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
30000 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
30010 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30020 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
30030 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71  rSkip);.      sq
30040 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30050 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
30060 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a  rSkip-2);.    }.
30070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
30080 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
30090 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70  _BLOBS.    if( p
300a0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
300b0 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ep ){.      sqli
300c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
300d0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
300e0 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e  , (int)(pLevel->
300f0 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29  iLikeRepCntr>>1)
30100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30110 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
30120 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
30130 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
30140 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ge(v);.    }.#en
30150 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76  dif.    if( pLev
30160 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
30170 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
30180 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
30190 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
301a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
301b0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
301c0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
301d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
301e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
301f0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
30200 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26  NLY)==0 || (ws &
30210 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
30220 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
30230 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
30240 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
30250 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
30260 65 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70 54 61  el->iTabCur==pTa
30270 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
30280 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20  >iFrom].iCursor 
30290 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
302a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
302b0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
302c0 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
302d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
302e0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
302f0 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  XED) .       || 
30300 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  ((ws & WHERE_MUL
30310 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c  TI_OR) && pLevel
30320 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20  ->u.pCovidx) .  
30330 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
30340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30350 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
30360 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
30370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30380 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
30390 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
303a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
303b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
303c0 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
303d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
303e0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
303f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30400 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
30410 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
30420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30430 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30440 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
30450 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65  }.    VdbeModule
30460 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
30470 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
30480 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  s", i,.         
30490 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
304a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
304b0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70  pLevel->iFrom].p
304c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
304d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
304e0 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
304f0 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
30500 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
30510 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
30520 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
30530 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30540 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
30550 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72  Break);..  asser
30560 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
30570 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  l<=pTabList->nSr
30580 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  c );.  for(i=0, 
30590 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
305a0 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
305b0 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  el; i++, pLevel+
305c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c  +){.    int k, l
305d0 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20  ast;.    VdbeOp 
305e0 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20  *pOp;.    Index 
305f0 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
30600 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30610 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
30620 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
30630 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
30640 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
30650 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
30660 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
30670 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  0 );.    pLoop =
30680 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
30690 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63  ..    /* For a c
306a0 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67  o-routine, chang
306b0 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e all OP_Column 
306c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
306d0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
306e0 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  * the co-routine
306f0 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66   into OP_Copy of
30700 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65   result containe
30710 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  d in a register.
30720 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64  .    ** OP_Rowid
30730 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c   becomes OP_Null
30740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30750 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69   pTabItem->fg.vi
30760 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
30770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
30780 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
30790 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
307a0 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
307b0 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c  oCopy(pParse, pL
307c0 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
307d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
307e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
30800 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
30810 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  , 0);.      cont
30820 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  inue;.    }..#if
30830 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
30840 45 5f 45 41 52 4c 59 5f 43 55 52 53 4f 52 5f 43  E_EARLY_CURSOR_C
30850 4c 4f 53 45 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  LOSE.    /* Clos
30860 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
30870 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
30880 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
30890 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20  WhereBegin..    
308a0 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
308b0 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  t close cursors 
308c0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75  that will be reu
308d0 73 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70  sed by the OR op
308e0 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
308f0 2a 20 28 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  * (WHERE_OR_SUBC
30900 4c 41 55 53 45 29 2e 20 20 41 6e 64 20 64 6f 20  LAUSE).  And do 
30910 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50  not close the OP
30920 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f  _OpenWrite curso
30930 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  rs.    ** create
30940 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53  d for the ONEPAS
30950 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  S optimization..
30960 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
30970 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
30980 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
30990 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
309a0 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
309b0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
309c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
309d0 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a  R_SUBCLAUSE)==0.
309e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
309f0 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
30a00 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
30a10 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
30a20 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
30a30 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
30a40 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
30a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30a60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
30a70 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
30a80 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
30a90 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20        if( (ws & 
30aa0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
30ab0 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73 20  0.       && (ws 
30ac0 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
30ad0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d  RE_AUTO_INDEX))=
30ae0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c  =0 .       && pL
30af0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70  evel->iIdxCur!=p
30b00 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
30b10 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a  ass[1].      ){.
30b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30b30 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30b40 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
30b50 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
30b60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
30b70 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
30b80 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
30b90 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65  , make VDBE code
30ba0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
30bb0 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
30bc0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
30bd0 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f  x instead of fro
30be0 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72  m the table wher
30bf0 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20  e possible.  In 
30c00 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a  some cases.    *
30c10 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
30c20 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65  ion prevents the
30c30 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72   table from ever
30c40 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69   being read, whi
30c50 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69  ch can.    ** yi
30c60 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e  eld a significan
30c70 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  t performance bo
30c80 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ost..    ** .   
30c90 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
30ca0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
30cb0 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
30cc0 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
30cd0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
30ce0 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
30cf0 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
30d00 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
30d10 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
30d20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
30d30 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
30d40 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
30d50 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
30d60 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
30d70 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
30d80 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
30d90 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
30da0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
30db0 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
30dc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
30dd0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
30de0 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
30df0 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
30e00 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
30e10 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
30e20 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
30e30 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
30e40 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
30e50 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
30e60 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
30e70 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
30e80 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20 28  ( pIdx.     && (
30e90 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
30ea0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c  ==ONEPASS_OFF ||
30eb0 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d   !HasRowid(pIdx-
30ec0 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26  >pTable)).     &
30ed0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
30ee0 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  led.    ){.     
30ef0 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
30f00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
30f10 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65  );.      k = pLe
30f20 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 23  vel->addrBody;.#
30f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
30f40 55 47 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  UG.      if( db-
30f50 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
30f60 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
30f70 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
30f80 28 22 54 52 41 4e 53 4c 41 54 45 20 6f 70 63 6f  ("TRANSLATE opco
30f90 64 65 73 20 69 6e 20 72 61 6e 67 65 20 25 64 2e  des in range %d.
30fa0 2e 25 64 5c 6e 22 2c 20 6b 2c 20 6c 61 73 74 2d  .%d\n", k, last-
30fb0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  1);.      }.#end
30fc0 69 66 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  if.      pOp = s
30fd0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
30fe0 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  v, k);.      for
30ff0 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  (; k<last; k++, 
31000 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
31010 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
31020 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
31030 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31040 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
31050 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a 23 69 66 64  ==OP_Column.#ifd
31060 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
31070 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
31080 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  .         || pOp
31090 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 66 66  ->opcode==OP_Off
310a0 73 65 74 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  set.#endif.     
310b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
310c0 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
310d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
310e0 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
310f0 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
31100 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
31110 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
31120 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
31130 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
31140 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
31150 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
31160 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
31170 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ];.            a
31180 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
31190 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
311a0 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
311b0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
311c0 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
311d0 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
311e0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
311f0 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  2 = x;.         
31200 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
31210 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
31220 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
31230 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
31240 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
31250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31260 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
31270 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
31280 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
31290 78 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x>=0 .          
312a0 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65      || pWInfo->e
312b0 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20  OnePass );.     
312c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
312d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
312e0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
312f0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
31300 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
31310 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
31320 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
31330 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
31340 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
31350 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
31360 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
31370 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75  >opcode==OP_IfNu
31380 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  llRow ){.       
31390 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
313a0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
313b0 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
313c0 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
313d0 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
313e0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
313f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
31400 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
31410 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
31420 64 64 6f 70 54 72 61 63 65 20 29 20 70 72 69 6e  ddopTrace ) prin
31430 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20 63 6f  tf("TRANSLATE co
31440 6d 70 6c 65 74 65 5c 6e 22 29 3b 0a 23 65 6e 64  mplete\n");.#end
31450 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
31460 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
31470 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
31480 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
31490 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
314a0 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
314b0 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
314c0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.